commit
331285f1dc
|
@ -85,7 +85,3 @@ transaction.log
|
|||
*-shell.log
|
||||
|
||||
apache-cxf/cxf-aegis/baeldung.xml
|
||||
apache-fop/src/test/resources/input.xml
|
||||
apache-fop/src/test/resources/output_herold.pdf
|
||||
apache-fop/src/test/resources/output_html2fo.pdf
|
||||
apache-fop/src/test/resources/output_jtidy.pdf
|
|
@ -13,6 +13,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
|||
- [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle)
|
||||
- [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique)
|
||||
- [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle)
|
||||
- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency)
|
||||
- [The K-Means Clustering Algorithm in Java](https://www.baeldung.com/java-k-means-clustering-algorithm)
|
||||
- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4)
|
||||
|
|
|
@ -15,8 +15,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
|
|||
- [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray)
|
||||
- [How to Merge Two Sorted Arrays](https://www.baeldung.com/java-merge-sorted-arrays)
|
||||
- [Median of Stream of Integers using Heap](https://www.baeldung.com/java-stream-integers-median-using-heap)
|
||||
- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
|
||||
- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
|
||||
- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
|
||||
- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
|
||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
|
||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4) [[next -->]](/../algorithms-miscellaneous-6)
|
||||
|
||||
|
|
|
@ -25,12 +25,6 @@
|
|||
<artifactId>commons-math3</artifactId>
|
||||
<version>${commons-math3.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>pl.allegro.finance</groupId>
|
||||
<artifactId>tradukisto</artifactId>
|
||||
|
@ -41,11 +35,6 @@
|
|||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-commons</artifactId>
|
||||
|
@ -78,7 +67,6 @@
|
|||
<commons-codec.version>1.11</commons-codec.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
<guava.version>28.1-jre</guava.version>
|
||||
<jackson.version>2.10.2</jackson.version>
|
||||
<junit.platform.version>1.6.0</junit.platform.version>
|
||||
</properties>
|
||||
|
||||
|
|
|
@ -1,61 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
public class BoruvkaMST {
|
||||
|
||||
private static Tree mst = new Tree();
|
||||
private static int totalWeight;
|
||||
|
||||
public BoruvkaMST(Graph graph) {
|
||||
DisjointSet dSet = new DisjointSet(graph.getNodes());
|
||||
|
||||
// repeat at most log N times or until we have N-1 edges
|
||||
for (int t = 1; t < graph.getNodes() && mst.getEdgeCount() < graph.getNodes() - 1; t = t + t) {
|
||||
|
||||
// foreach tree in forest, find closest edge
|
||||
Edge[] closestEdgeArray = new Edge[graph.getNodes()];
|
||||
for (Edge edge : graph.getAllEdges()) {
|
||||
int first = edge.getFirst();
|
||||
int second = edge.getSecond();
|
||||
int firstParent = dSet.getParent(first);
|
||||
int secondParent = dSet.getParent(second);
|
||||
if (firstParent == secondParent) {
|
||||
continue; // same tree
|
||||
}
|
||||
if (closestEdgeArray[firstParent] == null || edge.getWeight() < closestEdgeArray[firstParent].getWeight()) {
|
||||
closestEdgeArray[firstParent] = edge;
|
||||
}
|
||||
if (closestEdgeArray[secondParent] == null || edge.getWeight() < closestEdgeArray[secondParent].getWeight()) {
|
||||
closestEdgeArray[secondParent] = edge;
|
||||
}
|
||||
}
|
||||
|
||||
// add newly discovered edges to MST
|
||||
for (int i = 0; i < graph.getNodes(); i++) {
|
||||
Edge edge = closestEdgeArray[i];
|
||||
if (edge != null) {
|
||||
int first = edge.getFirst();
|
||||
int second = edge.getSecond();
|
||||
// don't add the same edge twice
|
||||
if (dSet.getParent(first) != dSet.getParent(second)) {
|
||||
mst.addEdge(edge);
|
||||
totalWeight += edge.getWeight();
|
||||
dSet.union(first, second);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Iterable<Edge> getMST() {
|
||||
return mst;
|
||||
}
|
||||
|
||||
public int getTotalWeight() {
|
||||
return totalWeight;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "MST: " + mst.toString() + " | Total Weight: " + totalWeight;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,49 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class DisjointSet {
|
||||
|
||||
private int[] nodeParents;
|
||||
private int[] nodeRanks;
|
||||
|
||||
public DisjointSet(int n) {
|
||||
nodeParents = new int[n];
|
||||
nodeRanks = new int[n];
|
||||
for (int i = 0; i < n; i++) {
|
||||
nodeParents[i] = i;
|
||||
nodeRanks[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int getParent(int node) {
|
||||
while (node != nodeParents[node]) {
|
||||
node = nodeParents[node];
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
public void union(int node1, int node2) {
|
||||
int node1Parent = getParent(node1);
|
||||
int node2Parent = getParent(node2);
|
||||
if (node1Parent == node2Parent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (nodeRanks[node1Parent] < nodeRanks[node2Parent]) {
|
||||
nodeParents[node1Parent] = node2Parent;
|
||||
}
|
||||
else if (nodeRanks[node1Parent] > nodeRanks[node2Parent]) {
|
||||
nodeParents[node2Parent] = node1Parent;
|
||||
}
|
||||
else {
|
||||
nodeParents[node2Parent] = node1Parent;
|
||||
nodeRanks[node1Parent]++;
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "Parent: " + Arrays.toString(nodeParents) + "Rank: " + Arrays.toString(nodeRanks);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,40 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
public class Edge {
|
||||
|
||||
private final int first;
|
||||
private final int second;
|
||||
private final int weight;
|
||||
|
||||
public Edge(int first, int second, int weight) {
|
||||
this.first = first;
|
||||
this.second = second;
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
public double getWeight() {
|
||||
return weight;
|
||||
}
|
||||
|
||||
public int getFirst() {
|
||||
return first;
|
||||
}
|
||||
|
||||
public int getSecond() {
|
||||
return second;
|
||||
}
|
||||
|
||||
public int getOtherNode(int firstNode) {
|
||||
int secondNode = 0;
|
||||
if (firstNode == first)
|
||||
secondNode = second;
|
||||
else if (firstNode == second)
|
||||
secondNode = first;
|
||||
return secondNode;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return String.format("%d-%d %d", first, second, weight);
|
||||
}
|
||||
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParseException;
|
||||
import com.fasterxml.jackson.databind.JsonMappingException;
|
||||
|
||||
public class Graph {
|
||||
|
||||
private int nodes;
|
||||
private int edges;
|
||||
private Tree[] trees;
|
||||
|
||||
public Graph(Input jsonGraph) throws JsonParseException, JsonMappingException, IOException {
|
||||
nodes = jsonGraph.getNodes();
|
||||
trees = (Tree[]) new Tree[nodes];
|
||||
for (int i = 0; i < nodes; i++) {
|
||||
trees[i] = new Tree();
|
||||
}
|
||||
|
||||
int edgesFromInput = jsonGraph.getEdges();
|
||||
for (int i = 0; i < edgesFromInput; i++) {
|
||||
int first = jsonGraph.getEdgeList()
|
||||
.get(i)
|
||||
.getFirst();
|
||||
int second = jsonGraph.getEdgeList()
|
||||
.get(i)
|
||||
.getSecond();
|
||||
int weight = jsonGraph.getEdgeList()
|
||||
.get(i)
|
||||
.getWeight();
|
||||
Edge edge = new Edge(first, second, weight);
|
||||
|
||||
trees[first].addEdge(edge);
|
||||
trees[second].addEdge(edge);
|
||||
edges++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public int getNodes() {
|
||||
return nodes;
|
||||
}
|
||||
|
||||
public int getEdges() {
|
||||
return edges;
|
||||
}
|
||||
|
||||
public Iterable<Edge> iterableTree(int i) {
|
||||
return trees[i];
|
||||
}
|
||||
|
||||
public Iterable<Edge> getAllEdges() {
|
||||
Iterable<Edge> list = new Tree();
|
||||
for (int i = 0; i < nodes; i++) {
|
||||
for (Edge edge : iterableTree(i)) {
|
||||
if (edge.getOtherNode(i) > i) {
|
||||
((Tree) list).addEdge(edge);
|
||||
}
|
||||
}
|
||||
}
|
||||
return list;
|
||||
}
|
||||
}
|
|
@ -1,65 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Input {
|
||||
private int nodes;
|
||||
private int edges;
|
||||
private List<E> edgeList;
|
||||
|
||||
public int getNodes() {
|
||||
return nodes;
|
||||
}
|
||||
|
||||
public void setNodes(int nodes) {
|
||||
this.nodes = nodes;
|
||||
}
|
||||
|
||||
public int getEdges() {
|
||||
return edges;
|
||||
}
|
||||
|
||||
public void setEdges(int edges) {
|
||||
this.edges = edges;
|
||||
}
|
||||
|
||||
public List<E> getEdgeList() {
|
||||
return edgeList;
|
||||
}
|
||||
|
||||
public void setEdgeList(List<E> edgeList) {
|
||||
this.edgeList = edgeList;
|
||||
}
|
||||
|
||||
static class E {
|
||||
private int first;
|
||||
private int second;
|
||||
private int weight;
|
||||
|
||||
public int getFirst() {
|
||||
return first;
|
||||
}
|
||||
|
||||
public void setFirst(int first) {
|
||||
this.first = first;
|
||||
}
|
||||
|
||||
public int getSecond() {
|
||||
return second;
|
||||
}
|
||||
|
||||
public void setSecond(int second) {
|
||||
this.second = second;
|
||||
}
|
||||
|
||||
public int getWeight() {
|
||||
return weight;
|
||||
}
|
||||
|
||||
public void setWeight(int weight) {
|
||||
this.weight = weight;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
public class Tree implements Iterable<Edge> {
|
||||
private Node root;
|
||||
private int edgeCount;
|
||||
|
||||
private static class Node {
|
||||
private Edge edge;
|
||||
private Node next;
|
||||
|
||||
public String toString() {
|
||||
String nextStr = next != null ? next.toString() : "";
|
||||
return edge.toString() + " | " + nextStr;
|
||||
}
|
||||
}
|
||||
|
||||
public Tree() {
|
||||
root = null;
|
||||
edgeCount = 0;
|
||||
}
|
||||
|
||||
public int getEdgeCount() {
|
||||
return edgeCount;
|
||||
}
|
||||
|
||||
public void addEdge(Edge edge) {
|
||||
Node oldRoot = root;
|
||||
root = new Node();
|
||||
root.edge = edge;
|
||||
root.next = oldRoot;
|
||||
edgeCount++;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
String rootStr = root != null ? root.toString() : "";
|
||||
return "Tree: " + rootStr + "Size: " + edgeCount;
|
||||
}
|
||||
|
||||
public Iterator<Edge> iterator() {
|
||||
return new LinkedIterator(root);
|
||||
}
|
||||
|
||||
private class LinkedIterator implements Iterator<Edge> {
|
||||
private Node current;
|
||||
|
||||
public LinkedIterator(Node root) {
|
||||
current = root;
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
return current != null;
|
||||
}
|
||||
|
||||
public Edge next() {
|
||||
Edge edge = current.edge;
|
||||
current = current.next;
|
||||
return edge;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStreamReader;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonParseException;
|
||||
import com.fasterxml.jackson.databind.JsonMappingException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
public class BoruvkaUnitTest {
|
||||
|
||||
private Input input;
|
||||
private static String INPUT_JSON = "/input.json";
|
||||
|
||||
@Before
|
||||
public void convertInputJsonToObject() throws JsonParseException, JsonMappingException, IOException {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
StringBuilder jsonStr = new StringBuilder();
|
||||
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(BoruvkaMST.class.getResourceAsStream(INPUT_JSON)))) {
|
||||
String line;
|
||||
while ((line = bufferedReader.readLine()) != null) {
|
||||
jsonStr.append(line)
|
||||
.append("\n");
|
||||
}
|
||||
}
|
||||
|
||||
input = mapper.readValue(jsonStr.toString(), Input.class);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInputGraph_whenBoruvkaPerformed_thenMinimumSpanningTree() throws JsonParseException, JsonMappingException, IOException {
|
||||
Graph graph = new Graph(input);
|
||||
BoruvkaMST boruvkaMST = new BoruvkaMST(graph);
|
||||
|
||||
Tree mst = (Tree) boruvkaMST.getMST();
|
||||
|
||||
assertEquals(30, boruvkaMST.getTotalWeight());
|
||||
assertEquals(4, mst.getEdgeCount());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
### Relevant Articles:
|
||||
|
||||
- [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm)
|
||||
- [Gradient Descent in Java](https://www.baeldung.com/java-gradient-descent)
|
||||
- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
|
||||
- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
|
||||
- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
|
||||
- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
|
||||
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
|
||||
- More articles: [[<-- prev]](/../algorithms-miscellaneous-5)
|
|
@ -0,0 +1,52 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>algorithms-miscellaneous-6</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>algorithms-miscellaneous-6</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.google.guava</groupId>
|
||||
<artifactId>guava</artifactId>
|
||||
<version>${guava.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.junit.platform</groupId>
|
||||
<artifactId>junit-platform-commons</artifactId>
|
||||
<version>${junit.platform.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>${org.assertj.core.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.projectlombok</groupId>
|
||||
<artifactId>lombok</artifactId>
|
||||
<version>${lombok.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-math3</artifactId>
|
||||
<version>${commons-math3.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<guava.version>28.1-jre</guava.version>
|
||||
<org.assertj.core.version>3.9.0</org.assertj.core.version>
|
||||
<junit.platform.version>1.6.0</junit.platform.version>
|
||||
<commons-math3.version>3.6.1</commons-math3.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -0,0 +1,84 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import com.google.common.graph.EndpointPair;
|
||||
import com.google.common.graph.MutableValueGraph;
|
||||
import com.google.common.graph.ValueGraphBuilder;
|
||||
|
||||
public class BoruvkaMST {
|
||||
|
||||
private static MutableValueGraph<Integer, Integer> mst = ValueGraphBuilder.undirected()
|
||||
.build();
|
||||
private static int totalWeight;
|
||||
|
||||
public BoruvkaMST(MutableValueGraph<Integer, Integer> graph) {
|
||||
|
||||
int size = graph.nodes().size();
|
||||
|
||||
UnionFind uf = new UnionFind(size);
|
||||
|
||||
// repeat at most log N times or until we have N-1 edges
|
||||
for (int t = 1; t < size && mst.edges().size() < size - 1; t = t + t) {
|
||||
|
||||
EndpointPair<Integer>[] closestEdgeArray = new EndpointPair[size];
|
||||
|
||||
// foreach tree in graph, find closest edge
|
||||
for (EndpointPair<Integer> edge : graph.edges()) {
|
||||
int u = edge.nodeU();
|
||||
int v = edge.nodeV();
|
||||
int uParent = uf.find(u);
|
||||
int vParent = uf.find(v);
|
||||
if (uParent == vParent) {
|
||||
continue; // same tree
|
||||
}
|
||||
|
||||
int weight = graph.edgeValueOrDefault(u, v, 0);
|
||||
|
||||
if (closestEdgeArray[uParent] == null) {
|
||||
closestEdgeArray[uParent] = edge;
|
||||
}
|
||||
if (closestEdgeArray[vParent] == null) {
|
||||
closestEdgeArray[vParent] = edge;
|
||||
}
|
||||
|
||||
int uParentWeight = graph.edgeValueOrDefault(closestEdgeArray[uParent].nodeU(), closestEdgeArray[uParent].nodeV(), 0);
|
||||
int vParentWeight = graph.edgeValueOrDefault(closestEdgeArray[vParent].nodeU(), closestEdgeArray[vParent].nodeV(), 0);
|
||||
|
||||
if (weight < uParentWeight) {
|
||||
closestEdgeArray[uParent] = edge;
|
||||
}
|
||||
if (weight < vParentWeight) {
|
||||
closestEdgeArray[vParent] = edge;
|
||||
}
|
||||
}
|
||||
|
||||
// add newly discovered edges to MST
|
||||
for (int i = 0; i < size; i++) {
|
||||
EndpointPair<Integer> edge = closestEdgeArray[i];
|
||||
if (edge != null) {
|
||||
int u = edge.nodeU();
|
||||
int v = edge.nodeV();
|
||||
int weight = graph.edgeValueOrDefault(u, v, 0);
|
||||
// don't add the same edge twice
|
||||
if (uf.find(u) != uf.find(v)) {
|
||||
mst.putEdgeValue(u, v, weight);
|
||||
totalWeight += weight;
|
||||
uf.union(u, v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public MutableValueGraph<Integer, Integer> getMST() {
|
||||
return mst;
|
||||
}
|
||||
|
||||
public int getTotalWeight() {
|
||||
return totalWeight;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "MST: " + mst.toString() + " | Total Weight: " + totalWeight;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
public class UnionFind {
|
||||
private int[] parents;
|
||||
private int[] ranks;
|
||||
|
||||
public UnionFind(int n) {
|
||||
parents = new int[n];
|
||||
ranks = new int[n];
|
||||
for (int i = 0; i < n; i++) {
|
||||
parents[i] = i;
|
||||
ranks[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public int find(int u) {
|
||||
while (u != parents[u]) {
|
||||
u = parents[u];
|
||||
}
|
||||
return u;
|
||||
}
|
||||
|
||||
public void union(int u, int v) {
|
||||
int uParent = find(u);
|
||||
int vParent = find(v);
|
||||
if (uParent == vParent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (ranks[uParent] < ranks[vParent]) {
|
||||
parents[uParent] = vParent;
|
||||
} else if (ranks[uParent] > ranks[vParent]) {
|
||||
parents[vParent] = uParent;
|
||||
} else {
|
||||
parents[vParent] = uParent;
|
||||
ranks[uParent]++;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,33 @@
|
|||
package com.baeldung.algorithms.gradientdescent;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
public class GradientDescent {
|
||||
|
||||
private final double precision = 0.000001;
|
||||
|
||||
public double findLocalMinimum(Function<Double, Double> f, double initialX) {
|
||||
double stepCoefficient = 0.1;
|
||||
double previousStep = 1.0;
|
||||
double currentX = initialX;
|
||||
double previousX = initialX;
|
||||
double previousY = f.apply(previousX);
|
||||
int iter = 100;
|
||||
|
||||
currentX += stepCoefficient * previousY;
|
||||
|
||||
while (previousStep > precision && iter > 0) {
|
||||
iter--;
|
||||
double currentY = f.apply(currentX);
|
||||
if (currentY > previousY) {
|
||||
stepCoefficient = -stepCoefficient / 2;
|
||||
}
|
||||
previousX = currentX;
|
||||
currentX += stepCoefficient * previousY;
|
||||
previousY = currentY;
|
||||
previousStep = StrictMath.abs(currentX - previousX);
|
||||
}
|
||||
return currentX;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,13 +1,13 @@
|
|||
package com.baeldung.algorithms.minheapmerge;
|
||||
|
||||
public class HeapNode {
|
||||
|
||||
int element;
|
||||
int arrayIndex;
|
||||
int nextElementIndex = 1;
|
||||
|
||||
public HeapNode(int element, int arrayIndex) {
|
||||
this.element = element;
|
||||
this.arrayIndex = arrayIndex;
|
||||
}
|
||||
}
|
||||
package com.baeldung.algorithms.minheapmerge;
|
||||
|
||||
public class HeapNode {
|
||||
|
||||
int element;
|
||||
int arrayIndex;
|
||||
int nextElementIndex = 1;
|
||||
|
||||
public HeapNode(int element, int arrayIndex) {
|
||||
this.element = element;
|
||||
this.arrayIndex = arrayIndex;
|
||||
}
|
||||
}
|
|
@ -1,88 +1,88 @@
|
|||
package com.baeldung.algorithms.minheapmerge;
|
||||
|
||||
public class MinHeap {
|
||||
|
||||
HeapNode[] heapNodes;
|
||||
|
||||
public MinHeap(HeapNode heapNodes[]) {
|
||||
this.heapNodes = heapNodes;
|
||||
heapifyFromLastLeafsParent();
|
||||
}
|
||||
|
||||
void heapifyFromLastLeafsParent() {
|
||||
int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
|
||||
while (lastLeafsParentIndex >= 0) {
|
||||
heapify(lastLeafsParentIndex);
|
||||
lastLeafsParentIndex--;
|
||||
}
|
||||
}
|
||||
|
||||
void heapify(int index) {
|
||||
int leftNodeIndex = getLeftNodeIndex(index);
|
||||
int rightNodeIndex = getRightNodeIndex(index);
|
||||
int smallestElementIndex = index;
|
||||
if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
|
||||
smallestElementIndex = leftNodeIndex;
|
||||
}
|
||||
if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
|
||||
smallestElementIndex = rightNodeIndex;
|
||||
}
|
||||
if (smallestElementIndex != index) {
|
||||
swap(index, smallestElementIndex);
|
||||
heapify(smallestElementIndex);
|
||||
}
|
||||
}
|
||||
|
||||
int getParentNodeIndex(int index) {
|
||||
return (index - 1) / 2;
|
||||
}
|
||||
|
||||
int getLeftNodeIndex(int index) {
|
||||
return (2 * index + 1);
|
||||
}
|
||||
|
||||
int getRightNodeIndex(int index) {
|
||||
return (2 * index + 2);
|
||||
}
|
||||
|
||||
HeapNode getRootNode() {
|
||||
return heapNodes[0];
|
||||
}
|
||||
|
||||
void heapifyFromRoot() {
|
||||
heapify(0);
|
||||
}
|
||||
|
||||
void swap(int i, int j) {
|
||||
HeapNode temp = heapNodes[i];
|
||||
heapNodes[i] = heapNodes[j];
|
||||
heapNodes[j] = temp;
|
||||
}
|
||||
|
||||
static int[] merge(int[][] array) {
|
||||
HeapNode[] heapNodes = new HeapNode[array.length];
|
||||
int resultingArraySize = 0;
|
||||
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
HeapNode node = new HeapNode(array[i][0], i);
|
||||
heapNodes[i] = node;
|
||||
resultingArraySize += array[i].length;
|
||||
}
|
||||
|
||||
MinHeap minHeap = new MinHeap(heapNodes);
|
||||
int[] resultingArray = new int[resultingArraySize];
|
||||
|
||||
for (int i = 0; i < resultingArraySize; i++) {
|
||||
HeapNode root = minHeap.getRootNode();
|
||||
resultingArray[i] = root.element;
|
||||
|
||||
if (root.nextElementIndex < array[root.arrayIndex].length) {
|
||||
root.element = array[root.arrayIndex][root.nextElementIndex++];
|
||||
} else {
|
||||
root.element = Integer.MAX_VALUE;
|
||||
}
|
||||
minHeap.heapifyFromRoot();
|
||||
}
|
||||
return resultingArray;
|
||||
}
|
||||
}
|
||||
package com.baeldung.algorithms.minheapmerge;
|
||||
|
||||
public class MinHeap {
|
||||
|
||||
HeapNode[] heapNodes;
|
||||
|
||||
public MinHeap(HeapNode heapNodes[]) {
|
||||
this.heapNodes = heapNodes;
|
||||
heapifyFromLastLeafsParent();
|
||||
}
|
||||
|
||||
void heapifyFromLastLeafsParent() {
|
||||
int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
|
||||
while (lastLeafsParentIndex >= 0) {
|
||||
heapify(lastLeafsParentIndex);
|
||||
lastLeafsParentIndex--;
|
||||
}
|
||||
}
|
||||
|
||||
void heapify(int index) {
|
||||
int leftNodeIndex = getLeftNodeIndex(index);
|
||||
int rightNodeIndex = getRightNodeIndex(index);
|
||||
int smallestElementIndex = index;
|
||||
if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
|
||||
smallestElementIndex = leftNodeIndex;
|
||||
}
|
||||
if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
|
||||
smallestElementIndex = rightNodeIndex;
|
||||
}
|
||||
if (smallestElementIndex != index) {
|
||||
swap(index, smallestElementIndex);
|
||||
heapify(smallestElementIndex);
|
||||
}
|
||||
}
|
||||
|
||||
int getParentNodeIndex(int index) {
|
||||
return (index - 1) / 2;
|
||||
}
|
||||
|
||||
int getLeftNodeIndex(int index) {
|
||||
return (2 * index + 1);
|
||||
}
|
||||
|
||||
int getRightNodeIndex(int index) {
|
||||
return (2 * index + 2);
|
||||
}
|
||||
|
||||
HeapNode getRootNode() {
|
||||
return heapNodes[0];
|
||||
}
|
||||
|
||||
void heapifyFromRoot() {
|
||||
heapify(0);
|
||||
}
|
||||
|
||||
void swap(int i, int j) {
|
||||
HeapNode temp = heapNodes[i];
|
||||
heapNodes[i] = heapNodes[j];
|
||||
heapNodes[j] = temp;
|
||||
}
|
||||
|
||||
static int[] merge(int[][] array) {
|
||||
HeapNode[] heapNodes = new HeapNode[array.length];
|
||||
int resultingArraySize = 0;
|
||||
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
HeapNode node = new HeapNode(array[i][0], i);
|
||||
heapNodes[i] = node;
|
||||
resultingArraySize += array[i].length;
|
||||
}
|
||||
|
||||
MinHeap minHeap = new MinHeap(heapNodes);
|
||||
int[] resultingArray = new int[resultingArraySize];
|
||||
|
||||
for (int i = 0; i < resultingArraySize; i++) {
|
||||
HeapNode root = minHeap.getRootNode();
|
||||
resultingArray[i] = root.element;
|
||||
|
||||
if (root.nextElementIndex < array[root.arrayIndex].length) {
|
||||
root.element = array[root.arrayIndex][root.nextElementIndex++];
|
||||
} else {
|
||||
root.element = Integer.MAX_VALUE;
|
||||
}
|
||||
minHeap.heapifyFromRoot();
|
||||
}
|
||||
return resultingArray;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,208 @@
|
|||
package com.baeldung.algorithms.play2048;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Board {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Board.class);
|
||||
|
||||
private final int[][] board;
|
||||
|
||||
private final int score;
|
||||
|
||||
public Board(int size) {
|
||||
assert(size > 0);
|
||||
|
||||
this.board = new int[size][];
|
||||
this.score = 0;
|
||||
|
||||
for (int x = 0; x < size; ++x) {
|
||||
this.board[x] = new int[size];
|
||||
for (int y = 0; y < size; ++y) {
|
||||
board[x][y] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private Board(int[][] board, int score) {
|
||||
this.score = score;
|
||||
this.board = new int[board.length][];
|
||||
|
||||
for (int x = 0; x < board.length; ++x) {
|
||||
this.board[x] = Arrays.copyOf(board[x], board[x].length);
|
||||
}
|
||||
}
|
||||
|
||||
public int getSize() {
|
||||
return board.length;
|
||||
}
|
||||
|
||||
public int getScore() {
|
||||
return score;
|
||||
}
|
||||
|
||||
public int getCell(Cell cell) {
|
||||
int x = cell.getX();
|
||||
int y = cell.getY();
|
||||
assert(x >= 0 && x < board.length);
|
||||
assert(y >= 0 && y < board.length);
|
||||
|
||||
return board[x][y];
|
||||
}
|
||||
|
||||
public boolean isEmpty(Cell cell) {
|
||||
return getCell(cell) == 0;
|
||||
}
|
||||
|
||||
public List<Cell> emptyCells() {
|
||||
List<Cell> result = new ArrayList<>();
|
||||
for (int x = 0; x < board.length; ++x) {
|
||||
for (int y = 0; y < board[x].length; ++y) {
|
||||
Cell cell = new Cell(x, y);
|
||||
if (isEmpty(cell)) {
|
||||
result.add(cell);
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
public Board placeTile(Cell cell, int number) {
|
||||
if (!isEmpty(cell)) {
|
||||
throw new IllegalArgumentException("That cell is not empty");
|
||||
}
|
||||
|
||||
Board result = new Board(this.board, this.score);
|
||||
result.board[cell.getX()][cell.getY()] = number;
|
||||
return result;
|
||||
}
|
||||
|
||||
public Board move(Move move) {
|
||||
// Clone the board
|
||||
int[][] tiles = new int[this.board.length][];
|
||||
for (int x = 0; x < this.board.length; ++x) {
|
||||
tiles[x] = Arrays.copyOf(this.board[x], this.board[x].length);
|
||||
}
|
||||
|
||||
LOG.debug("Before move: {}", Arrays.deepToString(tiles));
|
||||
// If we're doing an Left/Right move then transpose the board to make it a Up/Down move
|
||||
if (move == Move.LEFT || move == Move.RIGHT) {
|
||||
tiles = transpose(tiles);
|
||||
LOG.debug("After transpose: {}", Arrays.deepToString(tiles));
|
||||
}
|
||||
// If we're doing a Right/Down move then reverse the board.
|
||||
// With the above we're now always doing an Up move
|
||||
if (move == Move.DOWN || move == Move.RIGHT) {
|
||||
tiles = reverse(tiles);
|
||||
LOG.debug("After reverse: {}", Arrays.deepToString(tiles));
|
||||
}
|
||||
LOG.debug("Ready to move: {}", Arrays.deepToString(tiles));
|
||||
|
||||
// Shift everything up
|
||||
int[][] result = new int[tiles.length][];
|
||||
int newScore = 0;
|
||||
for (int x = 0; x < tiles.length; ++x) {
|
||||
LinkedList<Integer> thisRow = new LinkedList<>();
|
||||
for (int y = 0; y < tiles[0].length; ++y) {
|
||||
if (tiles[x][y] > 0) {
|
||||
thisRow.add(tiles[x][y]);
|
||||
}
|
||||
}
|
||||
|
||||
LOG.debug("Unmerged row: {}", thisRow);
|
||||
LinkedList<Integer> newRow = new LinkedList<>();
|
||||
while (thisRow.size() >= 2) {
|
||||
int first = thisRow.pop();
|
||||
int second = thisRow.peek();
|
||||
LOG.debug("Looking at numbers {} and {}", first, second);
|
||||
if (second == first) {
|
||||
LOG.debug("Numbers match, combining");
|
||||
int newNumber = first * 2;
|
||||
newRow.add(newNumber);
|
||||
newScore += newNumber;
|
||||
thisRow.pop();
|
||||
} else {
|
||||
LOG.debug("Numbers don't match");
|
||||
newRow.add(first);
|
||||
}
|
||||
}
|
||||
newRow.addAll(thisRow);
|
||||
LOG.debug("Merged row: {}", newRow);
|
||||
|
||||
result[x] = new int[tiles[0].length];
|
||||
for (int y = 0; y < tiles[0].length; ++y) {
|
||||
if (newRow.isEmpty()) {
|
||||
result[x][y] = 0;
|
||||
} else {
|
||||
result[x][y] = newRow.pop();
|
||||
}
|
||||
}
|
||||
}
|
||||
LOG.debug("After moves: {}", Arrays.deepToString(result));
|
||||
|
||||
// Un-reverse the board
|
||||
if (move == Move.DOWN || move == Move.RIGHT) {
|
||||
result = reverse(result);
|
||||
LOG.debug("After reverse: {}", Arrays.deepToString(result));
|
||||
}
|
||||
// Un-transpose the board
|
||||
if (move == Move.LEFT || move == Move.RIGHT) {
|
||||
result = transpose(result);
|
||||
LOG.debug("After transpose: {}", Arrays.deepToString(result));
|
||||
}
|
||||
return new Board(result, this.score + newScore);
|
||||
}
|
||||
|
||||
private static int[][] transpose(int[][] input) {
|
||||
int[][] result = new int[input.length][];
|
||||
|
||||
for (int x = 0; x < input.length; ++x) {
|
||||
result[x] = new int[input[0].length];
|
||||
for (int y = 0; y < input[0].length; ++y) {
|
||||
result[x][y] = input[y][x];
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static int[][] reverse(int[][] input) {
|
||||
int[][] result = new int[input.length][];
|
||||
|
||||
for (int x = 0; x < input.length; ++x) {
|
||||
result[x] = new int[input[0].length];
|
||||
for (int y = 0; y < input[0].length; ++y) {
|
||||
result[x][y] = input[x][input.length - y - 1];
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Arrays.deepToString(board);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (o == null || getClass() != o.getClass()) {
|
||||
return false;
|
||||
}
|
||||
Board board1 = (Board) o;
|
||||
return Arrays.deepEquals(board, board1.board);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Arrays.deepHashCode(board);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
package com.baeldung.algorithms.play2048;
|
||||
|
||||
import java.util.StringJoiner;
|
||||
|
||||
public class Cell {
|
||||
private int x;
|
||||
private int y;
|
||||
|
||||
public Cell(int x, int y) {
|
||||
this.x = x;
|
||||
this.y = y;
|
||||
}
|
||||
|
||||
public int getX() {
|
||||
return x;
|
||||
}
|
||||
|
||||
public int getY() {
|
||||
return y;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return new StringJoiner(", ", Cell.class.getSimpleName() + "[", "]").add("x=" + x).add("y=" + y).toString();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
package com.baeldung.algorithms.play2048;
|
||||
|
||||
import java.security.SecureRandom;
|
||||
import java.util.List;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Computer {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Computer.class);
|
||||
|
||||
private final SecureRandom rng = new SecureRandom();
|
||||
|
||||
public Board makeMove(Board input) {
|
||||
List<Cell> emptyCells = input.emptyCells();
|
||||
LOG.info("Number of empty cells: {}", emptyCells.size());
|
||||
|
||||
double numberToPlace = rng.nextDouble();
|
||||
LOG.info("New number probability: {}", numberToPlace);
|
||||
|
||||
int indexToPlace = rng.nextInt(emptyCells.size());
|
||||
Cell cellToPlace = emptyCells.get(indexToPlace);
|
||||
LOG.info("Placing number into empty cell: {}", cellToPlace);
|
||||
|
||||
return input.placeTile(cellToPlace, numberToPlace >= 0.9 ? 4 : 2);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
package com.baeldung.algorithms.play2048;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import org.apache.commons.math3.util.Pair;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
public class Human {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(Human.class);
|
||||
|
||||
public Board makeMove(Board input) {
|
||||
// For each move in MOVE
|
||||
// Generate board from move
|
||||
// Generate Score for Board
|
||||
// Return board with the best score
|
||||
//
|
||||
// Generate Score
|
||||
// If Depth Limit
|
||||
// Return Final Score
|
||||
// Total Score = 0
|
||||
// For every empty square in new board
|
||||
// Generate board with "2" in square
|
||||
// Calculate Score
|
||||
// Total Score += (Score * 0.9)
|
||||
// Generate board with "4" in square
|
||||
// Calculate Score
|
||||
// Total Score += (Score * 0.1)
|
||||
//
|
||||
// Calculate Score
|
||||
// For each move in MOVE
|
||||
// Generate board from move
|
||||
// Generate score for board
|
||||
// Return the best generated score
|
||||
|
||||
return Arrays.stream(Move.values())
|
||||
.parallel()
|
||||
.map(input::move)
|
||||
.filter(board -> !board.equals(input))
|
||||
.max(Comparator.comparingInt(board -> generateScore(board, 0)))
|
||||
.orElse(input);
|
||||
}
|
||||
|
||||
private int generateScore(Board board, int depth) {
|
||||
if (depth >= 3) {
|
||||
int finalScore = calculateFinalScore(board);
|
||||
LOG.debug("Final score for board {}: {}", board,finalScore);
|
||||
return finalScore;
|
||||
}
|
||||
|
||||
return board.emptyCells().stream()
|
||||
.parallel()
|
||||
.flatMap(cell -> Stream.of(new Pair<>(cell, 2), new Pair<>(cell, 4)))
|
||||
.mapToInt(move -> {
|
||||
LOG.debug("Simulating move {} at depth {}", move, depth);
|
||||
Board newBoard = board.placeTile(move.getFirst(), move.getSecond());
|
||||
int boardScore = calculateScore(newBoard, depth + 1);
|
||||
int calculatedScore = (int) (boardScore * (move.getSecond() == 2 ? 0.9 : 0.1));
|
||||
LOG.debug("Calculated score for board {} and move {} at depth {}: {}", newBoard, move, depth, calculatedScore);
|
||||
return calculatedScore;
|
||||
})
|
||||
.sum();
|
||||
}
|
||||
|
||||
private int calculateScore(Board board, int depth) {
|
||||
return Arrays.stream(Move.values())
|
||||
.parallel()
|
||||
.map(board::move)
|
||||
.filter(moved -> !moved.equals(board))
|
||||
.mapToInt(newBoard -> generateScore(newBoard, depth))
|
||||
.max()
|
||||
.orElse(0);
|
||||
}
|
||||
|
||||
private int calculateFinalScore(Board board) {
|
||||
List<List<Integer>> rowsToScore = new ArrayList<>();
|
||||
for (int i = 0; i < board.getSize(); ++i) {
|
||||
List<Integer> row = new ArrayList<>();
|
||||
List<Integer> col = new ArrayList<>();
|
||||
|
||||
for (int j = 0; j < board.getSize(); ++j) {
|
||||
row.add(board.getCell(new Cell(i, j)));
|
||||
col.add(board.getCell(new Cell(j, i)));
|
||||
}
|
||||
|
||||
rowsToScore.add(row);
|
||||
rowsToScore.add(col);
|
||||
}
|
||||
|
||||
return rowsToScore.stream()
|
||||
.parallel()
|
||||
.mapToInt(row -> {
|
||||
List<Integer> preMerged = row.stream()
|
||||
.filter(value -> value != 0)
|
||||
.collect(Collectors.toList());
|
||||
|
||||
int numMerges = 0;
|
||||
int monotonicityLeft = 0;
|
||||
int monotonicityRight = 0;
|
||||
for (int i = 0; i < preMerged.size() - 1; ++i) {
|
||||
Integer first = preMerged.get(i);
|
||||
Integer second = preMerged.get(i + 1);
|
||||
if (first.equals(second)) {
|
||||
++numMerges;
|
||||
} else if (first > second) {
|
||||
monotonicityLeft += first - second;
|
||||
} else {
|
||||
monotonicityRight += second - first;
|
||||
}
|
||||
}
|
||||
|
||||
int score = 1000;
|
||||
score += 250 * row.stream().filter(value -> value == 0).count();
|
||||
score += 750 * numMerges;
|
||||
score -= 10 * row.stream().mapToInt(value -> value).sum();
|
||||
score -= 50 * Math.min(monotonicityLeft, monotonicityRight);
|
||||
return score;
|
||||
})
|
||||
.sum();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
package com.baeldung.algorithms.play2048;
|
||||
|
||||
public enum Move {
|
||||
UP,
|
||||
DOWN,
|
||||
LEFT,
|
||||
RIGHT
|
||||
}
|
|
@ -0,0 +1,73 @@
|
|||
package com.baeldung.algorithms.play2048;
|
||||
|
||||
public class Play2048 {
|
||||
private static final int SIZE = 4;
|
||||
private static final int INITIAL_NUMBERS = 2;
|
||||
|
||||
public static void main(String[] args) {
|
||||
// The board and players
|
||||
Board board = new Board(SIZE);
|
||||
Computer computer = new Computer();
|
||||
Human human = new Human();
|
||||
|
||||
// The computer has two moves first
|
||||
System.out.println("Setup");
|
||||
System.out.println("=====");
|
||||
for (int i = 0; i < INITIAL_NUMBERS; ++i) {
|
||||
board = computer.makeMove(board);
|
||||
}
|
||||
|
||||
printBoard(board);
|
||||
do {
|
||||
board = human.makeMove(board);
|
||||
System.out.println("Human move");
|
||||
System.out.println("==========");
|
||||
printBoard(board);
|
||||
|
||||
board = computer.makeMove(board);
|
||||
System.out.println("Computer move");
|
||||
System.out.println("=============");
|
||||
printBoard(board);
|
||||
} while (!board.emptyCells().isEmpty());
|
||||
|
||||
System.out.println("Final Score: " + board.getScore());
|
||||
|
||||
}
|
||||
|
||||
private static void printBoard(Board board) {
|
||||
StringBuilder topLines = new StringBuilder();
|
||||
StringBuilder midLines = new StringBuilder();
|
||||
for (int x = 0; x < board.getSize(); ++x) {
|
||||
topLines.append("+--------");
|
||||
midLines.append("| ");
|
||||
}
|
||||
topLines.append("+");
|
||||
midLines.append("|");
|
||||
|
||||
|
||||
for (int y = 0; y < board.getSize(); ++y) {
|
||||
System.out.println(topLines);
|
||||
System.out.println(midLines);
|
||||
for (int x = 0; x < board.getSize(); ++x) {
|
||||
Cell cell = new Cell(x, y);
|
||||
System.out.print("|");
|
||||
if (board.isEmpty(cell)) {
|
||||
System.out.print(" ");
|
||||
} else {
|
||||
StringBuilder output = new StringBuilder(Integer.toString(board.getCell(cell)));
|
||||
while (output.length() < 8) {
|
||||
output.append(" ");
|
||||
if (output.length() < 8) {
|
||||
output.insert(0, " ");
|
||||
}
|
||||
}
|
||||
System.out.print(output);
|
||||
}
|
||||
}
|
||||
System.out.println("|");
|
||||
System.out.println(midLines);
|
||||
}
|
||||
System.out.println(topLines);
|
||||
System.out.println("Score: " + board.getScore());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,37 @@
|
|||
package com.baeldung.algorithms.boruvka;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.common.graph.MutableValueGraph;
|
||||
import com.google.common.graph.ValueGraphBuilder;
|
||||
|
||||
public class BoruvkaUnitTest {
|
||||
|
||||
private MutableValueGraph<Integer, Integer> graph;
|
||||
|
||||
@Before
|
||||
public void setup() {
|
||||
graph = ValueGraphBuilder.undirected()
|
||||
.build();
|
||||
graph.putEdgeValue(0, 1, 8);
|
||||
graph.putEdgeValue(0, 2, 5);
|
||||
graph.putEdgeValue(1, 2, 9);
|
||||
graph.putEdgeValue(1, 3, 11);
|
||||
graph.putEdgeValue(2, 3, 15);
|
||||
graph.putEdgeValue(2, 4, 10);
|
||||
graph.putEdgeValue(3, 4, 7);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void givenInputGraph_whenBoruvkaPerformed_thenMinimumSpanningTree() {
|
||||
BoruvkaMST boruvkaMST = new BoruvkaMST(graph);
|
||||
MutableValueGraph<Integer, Integer> mst = boruvkaMST.getMST();
|
||||
|
||||
assertEquals(30, boruvkaMST.getTotalWeight());
|
||||
assertEquals(4, mst.edges().size());
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,20 @@
|
|||
package com.baeldung.algorithms.gradientdescent;
|
||||
|
||||
import static org.junit.Assert.assertTrue;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class GradientDescentUnitTest {
|
||||
|
||||
@Test
|
||||
public void givenFunction_whenStartingPointIsOne_thenLocalMinimumIsFound() {
|
||||
Function<Double, Double> df = x ->
|
||||
StrictMath.abs(StrictMath.pow(x, 3)) - (3 * StrictMath.pow(x, 2)) + x;
|
||||
GradientDescent gd = new GradientDescent();
|
||||
double res = gd.findLocalMinimum(df, 1);
|
||||
assertTrue(res > 1.78);
|
||||
assertTrue(res < 1.84);
|
||||
}
|
||||
}
|
|
@ -1,22 +1,22 @@
|
|||
package com.baeldung.algorithms.minheapmerge;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class MinHeapUnitTest {
|
||||
|
||||
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
|
||||
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
|
||||
|
||||
@Test
|
||||
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
|
||||
int[] resultArray = MinHeap.merge(inputArray);
|
||||
|
||||
assertThat(resultArray.length, is(equalTo(10)));
|
||||
assertThat(resultArray, is(equalTo(expectedArray)));
|
||||
}
|
||||
|
||||
}
|
||||
package com.baeldung.algorithms.minheapmerge;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.equalTo;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
public class MinHeapUnitTest {
|
||||
|
||||
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
|
||||
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
|
||||
|
||||
@Test
|
||||
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
|
||||
int[] resultArray = MinHeap.merge(inputArray);
|
||||
|
||||
assertThat(resultArray.length, is(equalTo(10)));
|
||||
assertThat(resultArray, is(equalTo(expectedArray)));
|
||||
}
|
||||
|
||||
}
|
|
@ -1,3 +1,7 @@
|
|||
### Relevant Articles:
|
||||
|
||||
- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
|
||||
- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
|
||||
- [How an In-Place Sorting Algorithm Works](https://www.baeldung.com/java-in-place-sorting)
|
||||
- [Partitioning and Sorting Arrays with Many Repeated Entries](https://www.baeldung.com/java-sorting-arrays-with-repeated-entries)
|
||||
- More articles: [[<-- prev]](/algorithms-sorting)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package com.baeldung.algorithms.sort.bynumber;
|
||||
package com.baeldung.algorithms.bynumber;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
|
@ -5,21 +5,21 @@ import static com.baeldung.algorithms.quicksort.SortingUtils.swap;
|
|||
|
||||
public class DutchNationalFlagPartioning {
|
||||
|
||||
public static Partition partition(int[] a, int begin, int end) {
|
||||
public static Partition partition(int[] input, int begin, int end) {
|
||||
int lt = begin, current = begin, gt = end;
|
||||
int partitioningValue = a[begin];
|
||||
int partitioningValue = input[begin];
|
||||
|
||||
while (current <= gt) {
|
||||
int compareCurrent = compare(a[current], partitioningValue);
|
||||
int compareCurrent = compare(input[current], partitioningValue);
|
||||
switch (compareCurrent) {
|
||||
case -1:
|
||||
swap(a, current++, lt++);
|
||||
swap(input, current++, lt++);
|
||||
break;
|
||||
case 0:
|
||||
current++;
|
||||
break;
|
||||
case 1:
|
||||
swap(a, current, gt--);
|
||||
swap(input, current, gt--);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
package com.baeldung.algorithms.sort.bynumber;
|
||||
package com.baeldung.algorithms.bynumber;
|
||||
|
||||
import com.baeldung.algorithms.sort.bynumber.NaturalOrderComparators;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.ArrayList;
|
|
@ -11,10 +11,7 @@ This module contains articles about sorting algorithms.
|
|||
- [Heap Sort in Java](https://www.baeldung.com/java-heap-sort)
|
||||
- [Shell Sort in Java](https://www.baeldung.com/java-shell-sort)
|
||||
- [Counting Sort in Java](https://www.baeldung.com/java-counting-sort)
|
||||
- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
|
||||
- [How an In-Place Sorting Algorithm Works](https://www.baeldung.com/java-in-place-sorting)
|
||||
- [Selection Sort in Java](https://www.baeldung.com/java-selection-sort)
|
||||
- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers)
|
||||
- [Radix Sort in Java](https://www.baeldung.com/java-radix-sort)
|
||||
- [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically)
|
||||
- [Bucket Sort in Java](https://www.baeldung.com/java-bucket-sort)
|
||||
- More articles: [[next -->]](/algorithms-sorintg-2)
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
## Apache Avro
|
||||
|
||||
This module contains articles about Apache Avro
|
||||
|
||||
### Relevant Articles:
|
||||
- [Guide to Apache Avro](https://www.baeldung.com/java-apache-avro)
|
|
@ -1,72 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>apache-avro</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>apache-avro</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-simple</artifactId>
|
||||
<version>${slf4j.version}</version>
|
||||
<scope>compile</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.avro</groupId>
|
||||
<artifactId>avro</artifactId>
|
||||
<version>${avro.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.avro</groupId>
|
||||
<artifactId>avro-compiler</artifactId>
|
||||
<version>${avro.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.avro</groupId>
|
||||
<artifactId>avro-maven-plugin</artifactId>
|
||||
<version>${avro.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.avro</groupId>
|
||||
<artifactId>avro-maven-plugin</artifactId>
|
||||
<version>${avro.version}</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>schemas</id>
|
||||
<phase>generate-sources</phase>
|
||||
<goals>
|
||||
<goal>schema</goal>
|
||||
<goal>protocol</goal>
|
||||
<goal>idl-protocol</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<sourceDirectory>${project.basedir}/src/main/resources/</sourceDirectory>
|
||||
<outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<avro.version>1.8.2</avro.version>
|
||||
<slf4j.version>1.7.25</slf4j.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -1,3 +0,0 @@
|
|||
### Relevant Articles:
|
||||
|
||||
- [Introduction to Apache Beam](https://www.baeldung.com/apache-beam)
|
|
@ -1,43 +0,0 @@
|
|||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<groupId>com.baeldung.apache</groupId>
|
||||
<artifactId>apache-beam</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.beam</groupId>
|
||||
<artifactId>beam-sdks-java-core</artifactId>
|
||||
<version>${beam.version}</version>
|
||||
</dependency>
|
||||
<!-- runtime scoped -->
|
||||
<dependency>
|
||||
<groupId>org.apache.beam</groupId>
|
||||
<artifactId>beam-runners-direct-java</artifactId>
|
||||
<version>${beam.version}</version>
|
||||
<scope>runtime</scope>
|
||||
</dependency>
|
||||
<!-- test scoped -->
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>${assertj.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<beam.version>2.19.0</beam.version>
|
||||
<assertj.version>3.6.1</assertj.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -1,7 +0,0 @@
|
|||
## Apache BVal
|
||||
|
||||
This module contains articles about Apache BVal
|
||||
|
||||
### Relevant Articles:
|
||||
|
||||
- [Intro to Apache BVal](https://www.baeldung.com/apache-bval)
|
|
@ -1,40 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>apache-bval</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>apache-bval</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.apache.bval</groupId>
|
||||
<artifactId>bval-jsr</artifactId>
|
||||
<version>${bval.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>javax.validation</groupId>
|
||||
<artifactId>validation-api</artifactId>
|
||||
<version>${javax.validation.validation-api.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.bval</groupId>
|
||||
<artifactId>bval-extras</artifactId>
|
||||
<version>${bval.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<bval.version>1.1.2</bval.version>
|
||||
<javax.validation.validation-api.version>1.1.0.Final</javax.validation.validation-api.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -1,120 +0,0 @@
|
|||
package com.baeldung.model;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import javax.validation.constraints.Min;
|
||||
import javax.validation.constraints.NotNull;
|
||||
import javax.validation.constraints.Size;
|
||||
|
||||
import org.apache.bval.constraints.Email;
|
||||
import org.apache.bval.constraints.NotEmpty;
|
||||
import org.apache.bval.extras.constraints.checkdigit.IBAN;
|
||||
import org.apache.bval.extras.constraints.creditcard.Visa;
|
||||
import org.apache.bval.extras.constraints.file.Directory;
|
||||
import org.apache.bval.extras.constraints.net.InetAddress;
|
||||
|
||||
import com.baeldung.validation.Password;
|
||||
|
||||
public class User {
|
||||
@NotNull
|
||||
@Email
|
||||
private String email;
|
||||
|
||||
@NotEmpty
|
||||
@Password
|
||||
private String password;
|
||||
|
||||
@Size(min = 1, max = 20)
|
||||
private String name;
|
||||
|
||||
@Min(18)
|
||||
private int age;
|
||||
|
||||
@Visa
|
||||
private String cardNumber = "";
|
||||
|
||||
@IBAN
|
||||
private String iban = "";
|
||||
|
||||
@InetAddress
|
||||
private String website = "";
|
||||
|
||||
@Directory
|
||||
private File mainDirectory=new File(".");
|
||||
|
||||
public User() {
|
||||
}
|
||||
|
||||
public User(String email, String password, String name, int age) {
|
||||
super();
|
||||
this.email = email;
|
||||
this.password = password;
|
||||
this.name = name;
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
public String getEmail() {
|
||||
return email;
|
||||
}
|
||||
|
||||
public void setEmail(String email) {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
return password;
|
||||
}
|
||||
|
||||
public void setPassword(String password) {
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getAge() {
|
||||
return age;
|
||||
}
|
||||
|
||||
public void setAge(int age) {
|
||||
this.age = age;
|
||||
}
|
||||
|
||||
public String getCardNumber() {
|
||||
return cardNumber;
|
||||
}
|
||||
|
||||
public void setCardNumber(String cardNumber) {
|
||||
this.cardNumber = cardNumber;
|
||||
}
|
||||
|
||||
public String getIban() {
|
||||
return iban;
|
||||
}
|
||||
|
||||
public void setIban(String iban) {
|
||||
this.iban = iban;
|
||||
}
|
||||
|
||||
public String getWebsite() {
|
||||
return website;
|
||||
}
|
||||
|
||||
public void setWebsite(String website) {
|
||||
this.website = website;
|
||||
}
|
||||
|
||||
public File getMainDirectory() {
|
||||
return mainDirectory;
|
||||
}
|
||||
|
||||
public void setMainDirectory(File mainDirectory) {
|
||||
this.mainDirectory = mainDirectory;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
## Apache Curator
|
||||
|
||||
This module contains articles about Apache Curator
|
||||
|
||||
### Relevant Articles:
|
||||
|
||||
- [Introduction to Apache Curator](https://www.baeldung.com/apache-curator)
|
|
@ -1,70 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>apache-curator</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>apache-curator</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<!-- curator -->
|
||||
<dependency>
|
||||
<groupId>org.apache.curator</groupId>
|
||||
<artifactId>curator-x-async</artifactId>
|
||||
<version>${curator.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.zookeeper</groupId>
|
||||
<artifactId>zookeeper</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.curator</groupId>
|
||||
<artifactId>curator-recipes</artifactId>
|
||||
<version>${curator.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.zookeeper</groupId>
|
||||
<artifactId>zookeeper</artifactId>
|
||||
<version>${zookeeper.version}</version>
|
||||
</dependency>
|
||||
<!-- utils -->
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>${jackson.version}</version>
|
||||
</dependency>
|
||||
<!-- test scoped -->
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>${assertj.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.jayway.awaitility</groupId>
|
||||
<artifactId>awaitility</artifactId>
|
||||
<version>${avaitility.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<curator.version>4.0.1</curator.version>
|
||||
<zookeeper.version>3.4.11</zookeeper.version>
|
||||
<!-- testing -->
|
||||
<assertj.version>3.6.1</assertj.version>
|
||||
<avaitility.version>1.7.0</avaitility.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -3,7 +3,7 @@
|
|||
This module contains articles about Apache CXF
|
||||
|
||||
## Relevant Articles:
|
||||
- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
|
||||
|
||||
- [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api)
|
||||
- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring)
|
||||
- [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf)
|
||||
|
|
|
@ -0,0 +1,3 @@
|
|||
### Relevant Articles:
|
||||
|
||||
- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf)
|
|
@ -1,15 +0,0 @@
|
|||
*.class
|
||||
|
||||
#folders#
|
||||
/target
|
||||
/neoDb*
|
||||
/data
|
||||
/src/main/webapp/WEB-INF/classes
|
||||
*/META-INF/*
|
||||
|
||||
# Packaged files #
|
||||
*.war
|
||||
*.ear
|
||||
|
||||
# Files generated by integration tests
|
||||
*.txt
|
|
@ -1,93 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project
|
||||
xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>apache-fop</artifactId>
|
||||
<version>0.1-SNAPSHOT</version>
|
||||
<name>apache-fop</name>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung</groupId>
|
||||
<artifactId>parent-modules</artifactId>
|
||||
<version>1.0.0-SNAPSHOT</version>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<!-- new dependencies -->
|
||||
<dependency>
|
||||
<groupId>org.apache.xmlgraphics</groupId>
|
||||
<artifactId>fop</artifactId>
|
||||
<version>${fop.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.apache.avalon.framework</groupId>
|
||||
<artifactId>avalon-framework-api</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<groupId>org.apache.avalon.framework</groupId>
|
||||
<artifactId>avalon-framework-impl</artifactId>
|
||||
</exclusion>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>avalon-framework</groupId>
|
||||
<artifactId>avalon-framework-api</artifactId>
|
||||
<version>${avalon-framework.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>avalon-framework</groupId>
|
||||
<artifactId>avalon-framework-impl</artifactId>
|
||||
<version>${avalon-framework.version}</version>
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<artifactId>commons-logging</artifactId>
|
||||
<groupId>commons-logging</groupId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.dbdoclet</groupId>
|
||||
<artifactId>dbdoclet</artifactId>
|
||||
<version>${dbdoclet.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.dbdoclet</groupId>
|
||||
<artifactId>herold</artifactId>
|
||||
<version>${org.dbdoclet.herold.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>net.sf.jtidy</groupId>
|
||||
<artifactId>jtidy</artifactId>
|
||||
<version>${jtidy.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<finalName>apache-fop</finalName>
|
||||
<resources>
|
||||
<resource>
|
||||
<directory>src/main/resources</directory>
|
||||
<filtering>true</filtering>
|
||||
</resource>
|
||||
</resources>
|
||||
</build>
|
||||
|
||||
<properties>
|
||||
<fop.version>1.1</fop.version>
|
||||
<avalon-framework.version>4.3</avalon-framework.version>
|
||||
<dbdoclet.version>8.0.2</dbdoclet.version>
|
||||
<jtidy.version>r938</jtidy.version>
|
||||
<org.dbdoclet.herold.version>8.0.4</org.dbdoclet.herold.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
|
@ -1,6 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd" >
|
||||
|
||||
</beans>
|
|
@ -1,41 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
|
||||
xsi:schemaLocation="
|
||||
http://java.sun.com/xml/ns/javaee
|
||||
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"
|
||||
>
|
||||
|
||||
<display-name>Spring MVC Application</display-name>
|
||||
|
||||
<!-- Spring root -->
|
||||
<context-param>
|
||||
<param-name>contextClass</param-name>
|
||||
<param-value>
|
||||
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
|
||||
</param-value>
|
||||
</context-param>
|
||||
<context-param>
|
||||
<param-name>contextConfigLocation</param-name>
|
||||
<param-value>com.baeldung.config</param-value>
|
||||
</context-param>
|
||||
|
||||
<listener>
|
||||
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
|
||||
</listener>
|
||||
|
||||
<!-- Spring child -->
|
||||
<servlet>
|
||||
<servlet-name>api</servlet-name>
|
||||
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
|
||||
<load-on-startup>1</load-on-startup>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>api</servlet-name>
|
||||
<url-pattern>/</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<welcome-file-list>
|
||||
<welcome-file/>
|
||||
</welcome-file-list>
|
||||
|
||||
</web-app>
|
|
@ -1,122 +0,0 @@
|
|||
package com.baeldung.java;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.OutputStream;
|
||||
|
||||
import javax.xml.transform.Result;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMResult;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.sax.SAXResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.apache.fop.apps.Fop;
|
||||
import org.apache.fop.apps.FopFactory;
|
||||
import org.apache.xmlgraphics.util.MimeConstants;
|
||||
import org.dbdoclet.trafo.html.docbook.HtmlDocBookTrafo;
|
||||
import org.dbdoclet.trafo.script.Script;
|
||||
import org.junit.Test;
|
||||
import org.w3c.dom.Document;
|
||||
import org.w3c.tidy.Tidy;
|
||||
|
||||
public class ApacheFOPConvertHTMLIntegrationTest {
|
||||
private final String inputFile = "src/test/resources/input.html";
|
||||
private final String style = "src/test/resources/xhtml2fo.xsl";
|
||||
private final String style1 = "src/test/resources/docbook-xsl/fo/docbook.xsl";
|
||||
private final String output_jtidy = "src/test/resources/output_jtidy.pdf";
|
||||
private final String output_html2fo = "src/test/resources/output_html2fo.pdf";
|
||||
private final String output_herold = "src/test/resources/output_herold.pdf";
|
||||
private final String foFile = "src/test/resources/input.fo";
|
||||
private final String xmlFile = "src/test/resources/input.xml";
|
||||
|
||||
@Test
|
||||
public void whenTransformHTMLToPDFUsingJTidy_thenCorrect() throws Exception {
|
||||
final Document xhtml = fromHTMLToXHTML();
|
||||
final Document fo = fromXHTMLToFO(xhtml);
|
||||
fromFODocumentToPDF(fo, output_jtidy);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenTransformFromHTML2FOToPDF_thenCorrect() throws Exception {
|
||||
fromFOFileToPDF();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenTransformFromHeroldToPDF_thenCorrect() throws Exception {
|
||||
fromHTMLTOXMLUsingHerold();
|
||||
final Document fo = fromXMLFileToFO();
|
||||
fromFODocumentToPDF(fo, output_herold);
|
||||
}
|
||||
|
||||
private Document fromHTMLToXHTML() throws FileNotFoundException {
|
||||
final FileInputStream reader = new FileInputStream(inputFile);
|
||||
final Tidy tidy = new Tidy();
|
||||
final Document xml = tidy.parseDOM(reader, null);
|
||||
return xml;
|
||||
}
|
||||
|
||||
private Document fromXHTMLToFO(final Document xhtml) throws Exception {
|
||||
final DOMSource source = new DOMSource(xhtml);
|
||||
final DOMResult result = new DOMResult();
|
||||
final Transformer transformer = createTransformer(style);
|
||||
transformer.transform(source, result);
|
||||
return (Document) result.getNode();
|
||||
}
|
||||
|
||||
private void fromFODocumentToPDF(final Document fo, final String outputFile) throws Exception {
|
||||
final FopFactory fopFactory = FopFactory.newInstance();
|
||||
final OutputStream outStream = new BufferedOutputStream(new FileOutputStream(new File(outputFile)));
|
||||
|
||||
final Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outStream);
|
||||
final TransformerFactory factory = TransformerFactory.newInstance();
|
||||
final Transformer transformer = factory.newTransformer();
|
||||
final DOMSource src = new DOMSource(fo);
|
||||
final Result res = new SAXResult(fop.getDefaultHandler());
|
||||
transformer.transform(src, res);
|
||||
|
||||
outStream.close();
|
||||
}
|
||||
|
||||
private Transformer createTransformer(final String styleFile) throws Exception {
|
||||
final TransformerFactory factory = TransformerFactory.newInstance();
|
||||
final Transformer transformer = factory.newTransformer(new StreamSource(styleFile));
|
||||
|
||||
return transformer;
|
||||
}
|
||||
|
||||
private void fromFOFileToPDF() throws Exception {
|
||||
final FopFactory fopFactory = FopFactory.newInstance();
|
||||
final OutputStream outStream = new BufferedOutputStream(new FileOutputStream(new File(output_html2fo)));
|
||||
final Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outStream);
|
||||
|
||||
final TransformerFactory factory = TransformerFactory.newInstance();
|
||||
final Transformer transformer = factory.newTransformer();
|
||||
final Source src = new StreamSource(new FileInputStream(foFile));
|
||||
final Result res = new SAXResult(fop.getDefaultHandler());
|
||||
transformer.transform(src, res);
|
||||
|
||||
outStream.close();
|
||||
}
|
||||
|
||||
private Document fromXMLFileToFO() throws Exception {
|
||||
final Source source = new StreamSource(new FileInputStream(xmlFile));
|
||||
final DOMResult result = new DOMResult();
|
||||
final Transformer transformer = createTransformer(style1);
|
||||
transformer.transform(source, result);
|
||||
return (Document) result.getNode();
|
||||
}
|
||||
|
||||
private void fromHTMLTOXMLUsingHerold() throws Exception {
|
||||
final Script script = new Script();
|
||||
final HtmlDocBookTrafo transformer = new HtmlDocBookTrafo();
|
||||
transformer.setInputStream(new FileInputStream(inputFile));
|
||||
transformer.setOutputStream(new FileOutputStream(xmlFile));
|
||||
transformer.transform(script);
|
||||
}
|
||||
}
|
|
@ -1,143 +0,0 @@
|
|||
package com.baeldung.java;
|
||||
|
||||
import java.io.BufferedOutputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.net.URL;
|
||||
|
||||
import javax.xml.transform.Result;
|
||||
import javax.xml.transform.Source;
|
||||
import javax.xml.transform.Transformer;
|
||||
import javax.xml.transform.TransformerFactory;
|
||||
import javax.xml.transform.dom.DOMResult;
|
||||
import javax.xml.transform.dom.DOMSource;
|
||||
import javax.xml.transform.sax.SAXResult;
|
||||
import javax.xml.transform.stream.StreamSource;
|
||||
|
||||
import org.apache.fop.apps.Fop;
|
||||
import org.apache.fop.apps.FopFactory;
|
||||
import org.apache.xmlgraphics.util.MimeConstants;
|
||||
import org.dbdoclet.trafo.TrafoScriptManager;
|
||||
import org.dbdoclet.trafo.html.docbook.HtmlDocBookTrafo;
|
||||
import org.dbdoclet.trafo.script.Script;
|
||||
import org.junit.Test;
|
||||
import org.w3c.dom.Document;
|
||||
|
||||
public class ApacheFOPHeroldLiveTest {
|
||||
private final String[] inputUrls = {// @formatter:off
|
||||
// "http://www.baeldung.com/spring-security-basic-authentication",
|
||||
"http://www.baeldung.com/spring-security-digest-authentication"
|
||||
//"http://www.baeldung.com/spring-httpmessageconverter-rest",
|
||||
//"http://www.baeldung.com/2011/11/06/restful-web-service-discoverability-part-4/",
|
||||
//"http://www.baeldung.com/2011/11/13/rest-service-discoverability-with-spring-part-5/",
|
||||
//"http://www.baeldung.com/2013/01/11/etags-for-rest-with-spring/",
|
||||
// "http://www.baeldung.com/2012/01/18/rest-pagination-in-spring/",
|
||||
//"http://inprogress.baeldung.com/?p=1430",
|
||||
//"http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/",
|
||||
//"http://www.baeldung.com/rest-versioning",
|
||||
//"http://www.baeldung.com/2013/01/18/testing-rest-with-multiple-mime-types/"
|
||||
}; // @formatter:on
|
||||
|
||||
private final String style_file = "src/test/resources/docbook-xsl/fo/docbook.xsl";
|
||||
private final String output_file = "src/test/resources/final_output.pdf";
|
||||
private final String xmlInput = "src/test/resources/input.xml";
|
||||
private final String xmlOutput = "src/test/resources/output.xml";
|
||||
|
||||
// tests
|
||||
|
||||
@Test
|
||||
public void whenTransformFromHeroldToPDF_thenCorrect() throws Exception {
|
||||
final int len = inputUrls.length;
|
||||
fromHTMLTOXMLUsingHerold(inputUrls[0], false);
|
||||
for (int i = 1; i < len; i++) {
|
||||
fromHTMLTOXMLUsingHerold(inputUrls[i], true);
|
||||
}
|
||||
fixXML(xmlInput, xmlOutput);
|
||||
final Document fo = fromXMLFileToFO();
|
||||
fromFODocumentToPDF(fo, output_file);
|
||||
}
|
||||
|
||||
// UTIL
|
||||
|
||||
private void fromHTMLTOXMLUsingHerold(final String input, final boolean append) throws Exception {
|
||||
Script script;
|
||||
final TrafoScriptManager mgr = new TrafoScriptManager();
|
||||
final File profileFile = new File("src/test/resources/default.her");
|
||||
script = mgr.parseScript(profileFile);
|
||||
final HtmlDocBookTrafo transformer = new HtmlDocBookTrafo();
|
||||
transformer.setInputStream(getInputStream(input));
|
||||
transformer.setOutputStream(new FileOutputStream(xmlInput, append));
|
||||
|
||||
transformer.transform(script);
|
||||
}
|
||||
|
||||
private Document fromXMLFileToFO() throws Exception {
|
||||
final Source source = new StreamSource(new FileInputStream(xmlOutput));
|
||||
final DOMResult result = new DOMResult();
|
||||
final Transformer transformer = createTransformer(style_file);
|
||||
transformer.transform(source, result);
|
||||
return (Document) result.getNode();
|
||||
}
|
||||
|
||||
private void fromFODocumentToPDF(final Document fo, final String outputFile) throws Exception {
|
||||
final FopFactory fopFactory = FopFactory.newInstance();
|
||||
final OutputStream outStream = new BufferedOutputStream(new FileOutputStream(new File(outputFile)));
|
||||
|
||||
final Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, outStream);
|
||||
final TransformerFactory factory = TransformerFactory.newInstance();
|
||||
final Transformer transformer = factory.newTransformer();
|
||||
final DOMSource src = new DOMSource(fo);
|
||||
final Result res = new SAXResult(fop.getDefaultHandler());
|
||||
transformer.transform(src, res);
|
||||
|
||||
outStream.close();
|
||||
}
|
||||
|
||||
private Transformer createTransformer(final String styleFile) throws Exception {
|
||||
final TransformerFactory factory = TransformerFactory.newInstance();
|
||||
final Transformer transformer = factory.newTransformer(new StreamSource(styleFile));
|
||||
|
||||
return transformer;
|
||||
}
|
||||
|
||||
private InputStream getInputStream(final String input) throws IOException {
|
||||
final URL url = new URL(input);
|
||||
final HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
|
||||
httpcon.addRequestProperty("User-Agent", "Mozilla/4.0");
|
||||
return httpcon.getInputStream();
|
||||
}
|
||||
|
||||
private void fixXML(final String input, final String output) throws IOException {
|
||||
final BufferedReader reader = new BufferedReader(new FileReader(input));
|
||||
final FileWriter writer = new FileWriter(output);
|
||||
String line = reader.readLine();
|
||||
int count = 0;
|
||||
while (line != null) {
|
||||
line = line.replaceAll("”", "\"");
|
||||
line = line.replaceAll("“", "\"");
|
||||
// line = line.replaceAll("[^\\x00-\\x7F]", "");
|
||||
|
||||
if (line.contains("info>")) {
|
||||
writer.write(line.replace("info>", "section>"));
|
||||
} else if (!((line.startsWith("<?xml") || line.startsWith("<article") || line.startsWith("</article")) && (count > 4))) {
|
||||
writer.write(line.replaceAll("xml:id=\"", "xml:id=\"" + count));
|
||||
}
|
||||
writer.write("\n");
|
||||
|
||||
line = reader.readLine();
|
||||
count++;
|
||||
}
|
||||
writer.write("</article>");
|
||||
reader.close();
|
||||
writer.close();
|
||||
}
|
||||
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
*.class
|
||||
|
||||
#folders#
|
||||
/target
|
||||
/neoDb*
|
||||
/data
|
||||
/src/main/webapp/WEB-INF/classes
|
||||
*/META-INF/*
|
||||
|
||||
# Packaged files #
|
||||
*.war
|
||||
*.ear
|
|
@ -1,13 +0,0 @@
|
|||
transformation html2docbook;
|
||||
|
||||
section HTML {
|
||||
encoding = "windows-1252";
|
||||
exclude = ["//h3[contains(.,'I usually')]", "//*[@id='toc_container']", "//h2/span[@id='Table_of_Contents']/../following-sibling::ul", "//h2/span[@id='Table_of_Contents']/..", "//*[@id='disqus_thread']","//head","//*[@class='custom-design-100']","//*[@class='custom-design-114']", "//form","//*[@src]","//*[@id='inner-wrapper']/*[position()<7]" , "//*[@class='post-meta']" , "//*[@class='entry-title']","//*[@id='respond']" ,"//*[@id='comments']","//*[@class='post-entries']","//*[@class='social']/../../h3[last()]" ,"//*[@class='social']/.."];
|
||||
section-numbering-pattern = "(((\d\.)+)?\d?\.?\p{Z}*).*";
|
||||
}
|
||||
|
||||
section DocBook {
|
||||
add-index = false;
|
||||
decompose-tables = false;
|
||||
encoding = "UTF-8";
|
||||
}
|
|
@ -1,4 +0,0 @@
|
|||
The DocBook XSL stylesheets are maintained by Norman Walsh,
|
||||
<ndw@nwalsh.com>, and members of the DocBook Project,
|
||||
<docbook-developers@sf.net>
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
To view a list of all open DocBook Project XSL stylesheet bugs:
|
||||
|
||||
http://docbook.sf.net/tracker/xsl/bugs
|
||||
|
||||
To submit a bug report against the stylesheets:
|
||||
|
||||
http://docbook.sf.net/tracker/submit/bug
|
||||
|
||||
To do a full-text search of all DocBook Project issues:
|
||||
|
||||
http://docbook.sf.net/tracker/search
|
||||
|
||||
Discussion about the DocBook Project XSL stylesheets takes place
|
||||
on the docbook-apps mailing list:
|
||||
|
||||
http://wiki.docbook.org/topic/DocBookAppsMailingList
|
||||
|
||||
Real-time discussion takes place on IRC:
|
||||
|
||||
http://wiki.docbook.org/topic/DocBookIrcChannel
|
||||
irc://irc.freenode.net/docbook
|
|
@ -1,48 +0,0 @@
|
|||
Copyright
|
||||
---------
|
||||
Copyright (C) 1999-2007 Norman Walsh
|
||||
Copyright (C) 2003 Jiří Kosek
|
||||
Copyright (C) 2004-2007 Steve Ball
|
||||
Copyright (C) 2005-2008 The DocBook Project
|
||||
Copyright (C) 2011-2012 O'Reilly Media
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the ``Software''), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
Except as contained in this notice, the names of individuals
|
||||
credited with contribution to this software shall not be used in
|
||||
advertising or otherwise to promote the sale, use or other
|
||||
dealings in this Software without prior written authorization
|
||||
from the individuals in question.
|
||||
|
||||
Any stylesheet derived from this Software that is publically
|
||||
distributed will be identified with a different name and the
|
||||
version strings in any derived Software will be changed so that
|
||||
no possibility of confusion between the derived package and this
|
||||
Software will exist.
|
||||
|
||||
Warranty
|
||||
--------
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL NORMAN WALSH OR ANY OTHER
|
||||
CONTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
Contacting the Author
|
||||
---------------------
|
||||
The DocBook XSL stylesheets are maintained by Norman Walsh,
|
||||
<ndw@nwalsh.com>, and members of the DocBook Project,
|
||||
<docbook-developers@sf.net>
|
|
@ -1,88 +0,0 @@
|
|||
$Id: INSTALL 6145 2006-08-06 13:13:03Z xmldoc $
|
||||
|
||||
INSTALL file for the DocBook XSL stylesheets distribution
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Case #1: Installation using a package management system
|
||||
----------------------------------------------------------------------
|
||||
If you have installed the DocBook XSL distribution using "apt-get",
|
||||
"yum", "urpmi", or some similar package-management front-end,
|
||||
then, as part of the package installation, the stylesheets have
|
||||
already been automatically installed in the appropriate location
|
||||
for your system, and your XML catalog environment has probably
|
||||
been updated to use that location.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Case #2: Installing manually
|
||||
----------------------------------------------------------------------
|
||||
If you have downloaded a docbook-xsl zip, tar.gz, or tar.bz2
|
||||
file, use the following steps to install it.
|
||||
|
||||
1. Move the zip, tar.gz, or tar.bz2 file to the directory where
|
||||
you'd like to install it (not to a temporary directory).
|
||||
|
||||
2. unzip or untar/uncompress the file
|
||||
|
||||
That will create a docbook-xsl-$VERSION directory (where
|
||||
$VERSION is the version number for the release).
|
||||
|
||||
The remaining steps are all OPTIONAL. They are intended to
|
||||
automatically update your user environment with XML Catalog
|
||||
information about the DocBook XSL distribution. You are NOT
|
||||
REQUIRED to complete these remaining steps. However, if you do
|
||||
not, and you want to use XML catalogs with the DocBook XSL
|
||||
stylesheets, you will need to manually update your XML catalog
|
||||
environment
|
||||
|
||||
3. Change to the docbook-xsl-$VERSION directory and execute the
|
||||
install.sh script:
|
||||
|
||||
./install.sh
|
||||
|
||||
That will launch an interactive installer, which will emit a
|
||||
series of prompts for you to respond to.
|
||||
|
||||
To instead run it non-interactively without being prompted
|
||||
for confirmation of the changes it makes, invoke it with the
|
||||
"--batch" switch, like this:
|
||||
|
||||
./install.sh --batch
|
||||
|
||||
After the process is complete, the installer will emit a
|
||||
message with a command you need to run in order to source
|
||||
your environment for use with the stylesheets.
|
||||
|
||||
4. To test that he installation has updated your environment
|
||||
correctly, execute the test.sh script:
|
||||
|
||||
./test.sh
|
||||
|
||||
That will test your XML catalog environment, using both the
|
||||
xmlcatalog application and the Apache XML Commons Resolver.
|
||||
|
||||
NOTE: The test.sh file is not created until the install.sh
|
||||
file is run for the first time.
|
||||
|
||||
5. (UNINSTALLING) If/when you want to uninstall the release,
|
||||
execute the uninstall.sh script.
|
||||
|
||||
./uninstall.sh
|
||||
|
||||
To instead run it non-interactively without being prompted
|
||||
for confirmation of the changes it makes, invoke it with the
|
||||
"--batch" switch, like this:
|
||||
|
||||
./uninstall.sh --batch
|
||||
|
||||
NOTE: The uninstall.sh file is not created until the install.sh
|
||||
file is run for the first time.
|
||||
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Note to packagers
|
||||
----------------------------------------------------------------------
|
||||
The install.sh, .CatalogManager.properties.example, and .urilist
|
||||
files should not be packaged. They are useful only to users who
|
||||
are installing the stylesheets manually.
|
||||
|
||||
The catalog.xml file should be packaged.
|
|
@ -1,89 +0,0 @@
|
|||
# $Id: Makefile.tests 8481 2009-07-13 20:18:41Z abdelazer $
|
||||
#
|
||||
# This makefile does a "smoketest" of stylesheets for various
|
||||
# output formats in the DocBook XSL Stylesheets release package.
|
||||
# It doesn't actually check the output -- it's just useful for
|
||||
# confirming whether each XSLT transformation actually executes
|
||||
# successfully without any errors.
|
||||
#
|
||||
# To use it, run "make check" or just "make"
|
||||
|
||||
XSLTPROC=xsltproc
|
||||
XSLTPROC_FLAGS=
|
||||
|
||||
TESTFILE=tests/refentry.007.xml
|
||||
TESTFILE_NS=tests/refentry.007.ns.xml
|
||||
|
||||
NORMAL_STYLES=fo/docbook.xsl html/docbook.xsl xhtml/docbook.xsl
|
||||
NORMAL_PROFILE_STYLES=fo/profile-docbook.xsl html/profile-docbook.xsl xhtml/profile-docbook.xsl
|
||||
CHUNK_STYLES=html/chunk.xsl html/onechunk.xsl xhtml/chunk.xsl xhtml/onechunk.xsl
|
||||
HELP_STYLES=htmlhelp/htmlhelp.xsl javahelp/javahelp.xsl eclipse/eclipse.xsl
|
||||
MULTIFILE_STYLES=$(CHUNK_STYLES) $(HELP_STYLES)
|
||||
CHUNK_PROFILE_STYLES=html/profile-chunk.xsl html/profile-onechunk.xsl xhtml/profile-chunk.xsl xhtml/profile-onechunk.xsl
|
||||
HELP_PROFILE_STYLES=htmlhelp/profile-htmlhelp.xsl eclipse/profile-eclipse.xsl javahelp/profile-javahelp.xsl
|
||||
MULTIFILE_PROFILE_STYLES=$(CHUNK_PROFILE_STYLES) $(HELP_PROFILE_STYLES)
|
||||
|
||||
MAN_STYLE=manpages/docbook.xsl
|
||||
MAN_PROFILE_STYLE=manpages/profile-docbook.xsl
|
||||
|
||||
TWO_PROFILE_STYLE=profiling/profile.xsl
|
||||
|
||||
ROUNDTRIP_STYLES=roundtrip/dbk2ooo.xsl roundtrip/dbk2pages.xsl roundtrip/dbk2wordml.xsl
|
||||
SLIDES_STYLES=slides/html/default.xsl slides/xhtml/default.xsl slides/fo/plain.xsl
|
||||
WEBSITE_STYLES=website/website.xsl
|
||||
WEBSITE_CHUNK_STYLES=website/chunk-website.xsl
|
||||
|
||||
# chunked output gets written to TMP_OUTPUT_DIR
|
||||
TMP_OUTPUT_DIR=/tmp/smoketest-output/
|
||||
# if you don't want TMP_OUTPUT_DIR and its contents deleted, unset
|
||||
# SMOKETEST_CLEAN_TARGET; e.g. "make check SMOKETEST_CLEAN_TARGET=''"
|
||||
SMOKETEST_CLEAN_TARGET=smoketest-clean
|
||||
|
||||
check: smoketest-make-tmp-dir smoketest-normal smoketest-normal-profile smoketest-chunk smoketest-chunk-profile smoketest-man smoketest-man-profile smoketest-two-profile $(SMOKETEST_CLEAN_TARGET)
|
||||
|
||||
smoketest-make-tmp-dir:
|
||||
$(RM) -r $(TMP_OUTPUT_DIR)
|
||||
mkdir '$(TMP_OUTPUT_DIR)'
|
||||
|
||||
smoketest-normal:
|
||||
for stylesheet in $(NORMAL_STYLES); do \
|
||||
echo "$(XSLT) $(TESTFILE) $$stylesheet > /dev/null"; \
|
||||
$(XSLT) $(TESTFILE) $$stylesheet > /dev/null; \
|
||||
echo "$(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null"; \
|
||||
$(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null; \
|
||||
done
|
||||
|
||||
smoketest-normal-profile:
|
||||
for stylesheet in $(NORMAL_PROFILE_STYLES); do \
|
||||
echo "$(XSLT) $(TESTFILE) $$stylesheet > /dev/null"; \
|
||||
$(XSLT) $(TESTFILE) $$stylesheet > /dev/null; \
|
||||
echo "$(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null"; \
|
||||
$(XSLT) $(TESTFILE_NS) $$stylesheet > /dev/null; \
|
||||
done
|
||||
|
||||
smoketest-chunk:
|
||||
for stylesheet in $(MULTIFILE_STYLES) ; do \
|
||||
$(XSLT) $(TESTFILE) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
|
||||
$(XSLT) $(TESTFILE_NS) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
|
||||
done;
|
||||
|
||||
smoketest-chunk-profile:
|
||||
for stylesheet in $(MULTIFILE_PROFILE_STYLES) ; do \
|
||||
$(XSLT) $(TESTFILE) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
|
||||
$(XSLT) $(TESTFILE_NS) $$stylesheet manifest.in.base.dir=1 base.dir=$(TMP_OUTPUT_DIR) ; \
|
||||
done;
|
||||
|
||||
smoketest-man:
|
||||
$(XSLT) $(TESTFILE) $(MAN_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ; \
|
||||
$(XSLT) $(TESTFILE_NS) $(MAN_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ;
|
||||
|
||||
smoketest-man-profile:
|
||||
$(XSLT) $(TESTFILE) $(MAN_PROFILE_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ; \
|
||||
$(XSLT) $(TESTFILE_NS) $(MAN_PROFILE_STYLE) man.output.in.separate.dir=1 man.output.base.dir=$(TMP_OUTPUT_DIR) ;
|
||||
|
||||
smoketest-two-profile:
|
||||
$(XSLT) $(TESTFILE_NS) $(TWO_PROFILE_STYLE) > /dev/null ;
|
||||
|
||||
smoketest-clean:
|
||||
$(RM) -r $(TMP_OUTPUT_DIR)
|
||||
|
|
@ -1,176 +0,0 @@
|
|||
Changes since the 1.78.0 release
|
||||
|
||||
Note: This document lists changes only since the 1.78.0 release. If you instead
|
||||
want a record of the complete list of changes for the codebase over its entire
|
||||
history, you can obtain one by running the following commands:
|
||||
|
||||
svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl
|
||||
svn log --xml --verbose xsl > ChangeHistory.xml
|
||||
|
||||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
Table of Contents
|
||||
|
||||
Release Notes: 1.78.1
|
||||
|
||||
Common
|
||||
FO
|
||||
HTML
|
||||
Manpages
|
||||
Webhelp
|
||||
Params
|
||||
Highlighting
|
||||
|
||||
Release Notes: 1.78.1
|
||||
|
||||
The following is a list of changes that have been made since the 1.78.0
|
||||
release.
|
||||
|
||||
Common
|
||||
|
||||
The following changes have been made to the common code since the 1.78.0
|
||||
release.
|
||||
|
||||
• Robert Stayton: titles.xsl
|
||||
|
||||
Make sure part and set titleabbrev are used in mode="titleabbrev.markup"
|
||||
|
||||
• Robert Stayton: titles.xsl
|
||||
|
||||
Add empty default template for titleabbrev since it is always processed in a mode.
|
||||
|
||||
• Robert Stayton: gentext.xsl
|
||||
|
||||
Make consistent handling of titleabbrev in xrefs.
|
||||
|
||||
• Robert Stayton: titles.xsl
|
||||
|
||||
for missing title in xref, provide parent information of target to help locate problem element.
|
||||
Process bridgehead in mode="title.markup", not normal mode.
|
||||
|
||||
• Jirka Kosek: l10n.xsl
|
||||
|
||||
Fixed bug #3598963
|
||||
|
||||
• Robert Stayton: gentext.xsl; labels.xsl
|
||||
|
||||
Make sure bridgeheads are not numbered in all contexts, including html title attributes.
|
||||
|
||||
FO
|
||||
|
||||
The following changes have been made to the fo code since the 1.78.0 release.
|
||||
|
||||
• Robert Stayton: division.xsl
|
||||
|
||||
Fix bug where part TOC not generated when partintro is present.
|
||||
|
||||
• Jirka Kosek: xref.xsl
|
||||
|
||||
Footnotes can't be placed into fo:float
|
||||
|
||||
• Robert Stayton: titlepage.templates.xml
|
||||
|
||||
Remove margin-left when start-indent is used because they interfere
|
||||
with each other.
|
||||
|
||||
• Robert Stayton: fo.xsl; pagesetup.xsl
|
||||
|
||||
Use dingbat.fontset rather than dingbat.font.family so it falls
|
||||
back to symbol font if glyph not found, like other font properties.
|
||||
|
||||
• Robert Stayton: inline.xsl
|
||||
|
||||
Change last instance of inline.charseq in inline glossterm to
|
||||
inline.italicseq so it is consistent with the others.
|
||||
|
||||
• Robert Stayton: xref.xsl
|
||||
|
||||
Make consistent handling of titleabbrev in xrefs.
|
||||
|
||||
HTML
|
||||
|
||||
The following changes have been made to the html code since the 1.78.0 release.
|
||||
|
||||
• Robert Stayton: admon.xsl
|
||||
|
||||
Turn off $admon.style if $make.clean.html is set to non-zero.
|
||||
|
||||
• Jirka Kosek: highlight.xsl
|
||||
|
||||
Added new definitions for syntax highlighting
|
||||
|
||||
• Robert Stayton: chunk-common.xsl
|
||||
|
||||
Make active.olink.hrefs param work for chunked output too.
|
||||
|
||||
• Robert Stayton: xref.xsl
|
||||
|
||||
Make consistent handling of titleabbrev in xrefs.
|
||||
|
||||
• Robert Stayton: graphics.xsl
|
||||
|
||||
Add round() function when pixel counts are used for image width and height.
|
||||
|
||||
• Robert Stayton: glossary.xsl
|
||||
|
||||
fix missing class and id attributes on glossterm and glossdef.
|
||||
|
||||
• Robert Stayton: autoidx.xsl
|
||||
|
||||
Fix bug where prefer.index.titleabbrev ignored info/titleabbrev.
|
||||
|
||||
Manpages
|
||||
|
||||
The following changes have been made to the manpages code since the 1.78.0
|
||||
release.
|
||||
|
||||
• Robert Stayton: utility.xsl
|
||||
|
||||
Fix bug 3599520: spurious newline in para when starts with
|
||||
whitespace and inline element.
|
||||
|
||||
Webhelp
|
||||
|
||||
The following changes have been made to the webhelp code since the 1.78.0
|
||||
release.
|
||||
|
||||
• David Cramer: xsl/webhelp-common.xsl
|
||||
|
||||
Webhelp: Fix test for webhelp.include.search.tab param
|
||||
|
||||
• David Cramer: Makefile.sample
|
||||
|
||||
Webhelp: Fix order of args to xsltproc
|
||||
|
||||
• David Cramer: docsrc/readme.xml
|
||||
|
||||
Webhelp: Turn on xinclude-test.xml in readme to demo xinclude functionality
|
||||
|
||||
• David Cramer: Makefile; Makefile.sample
|
||||
|
||||
Webhelp: In Makefiles, do xinclude in first pass at document
|
||||
|
||||
Params
|
||||
|
||||
The following changes have been made to the params code since the 1.78.0
|
||||
release.
|
||||
|
||||
• David Cramer: webhelp.include.search.tab.xml
|
||||
|
||||
Webhelp: Fix test for webhelp.include.search.tab param
|
||||
|
||||
• Robert Stayton: article.appendix.title.properties.xml
|
||||
|
||||
Remove unneeded margin-left property from article appendix title.
|
||||
It interferes with the start-indent property.
|
||||
|
||||
Highlighting
|
||||
|
||||
The following changes have been made to the highlighting code since the 1.78.0
|
||||
release.
|
||||
|
||||
• Jirka Kosek: c-hl.xml; cpp-hl.xml; sql2003-hl.xml; php-hl.xml; upc-hl.xml;
|
||||
bourne-hl.xml; ⋯
|
||||
|
||||
Added new definitions for syntax highlighting
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
<html><head><meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Changes since the 1.78.0 release</title><meta name="generator" content="DocBook XSL Stylesheets V1.78.1"><meta name="description" content="Note: This document lists changes only since the 1.78.0 release. If you instead want a record of the complete list of changes for the codebase over its entire history, you can obtain one by running the following commands: svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl svn log --xml --verbose xsl > ChangeHistory.xml"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="article"><div class="titlepage"><div><div><h2 class="title"><a name="idp12912"></a>Changes since the 1.78.0 release</h2></div><div><div class="abstract"><p><span class="strong"><strong>Note:</strong></span> This
|
||||
document lists changes only since the 1.78.0 release.
|
||||
If you instead want a record of the complete list of
|
||||
changes for the codebase over its entire history, you
|
||||
can obtain one by running the following commands:
|
||||
|
||||
</p><pre class="screen"> <code class="code">svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl</code>
|
||||
<code class="code">svn log --xml --verbose xsl > ChangeHistory.xml</code></pre></div></div></div><hr></div><div class="toc"><p><b>Table of Contents</b></p><dl class="toc"><dt><span class="sect1"><a href="#V1.78.1">Release Notes: 1.78.1</a></span></dt><dd><dl><dt><span class="sect2"><a href="#V1.78.1_Common">Common</a></span></dt><dt><span class="sect2"><a href="#V1.78.1_FO">FO</a></span></dt><dt><span class="sect2"><a href="#V1.78.1_HTML">HTML</a></span></dt><dt><span class="sect2"><a href="#V1.78.1_Manpages">Manpages</a></span></dt><dt><span class="sect2"><a href="#V1.78.1_Webhelp">Webhelp</a></span></dt><dt><span class="sect2"><a href="#V1.78.1_Params">Params</a></span></dt><dt><span class="sect2"><a href="#V1.78.1_Highlighting">Highlighting</a></span></dt></dl></dd></dl></div><div class="sect1"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="V1.78.1"></a>Release Notes: 1.78.1</h2></div></div></div><p>The following is a list of changes that have been made
|
||||
since the 1.78.0 release.</p><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_Common"></a>Common</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">common</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">Make sure part and set <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> are used in mode="titleabbrev.markup"</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">Add empty default template for <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> since it is always processed in a mode.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: gentext.xsl</code></p><pre class="screen"><span class="commit-message">Make consistent handling of <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> in xrefs.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: titles.xsl</code></p><pre class="screen"><span class="commit-message">for missing <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> in <a href="http://docbook.org/tdg5/en/html/xref.html"><code class="sgmltag-element">xref</code></a>, provide parent information of target to help locate problem element.
|
||||
Process <a href="http://docbook.org/tdg5/en/html/bridgehead.html"><code class="sgmltag-element">bridgehead</code></a> in mode="title.markup", not normal mode.</span></pre></li><li class="listitem"><p><code class="literal">Jirka Kosek: l10n.xsl</code></p><pre class="screen"><span class="commit-message">Fixed bug #3598963</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: gentext.xsl; labels.xsl</code></p><pre class="screen"><span class="commit-message">Make sure bridgeheads are not numbered in all contexts, including html <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a> attributes.</span></pre></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_FO"></a>FO</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">fo</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">Robert Stayton: division.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug where part <a href="http://docbook.org/tdg5/en/html/toc.html"><code class="sgmltag-element">TOC</code></a> not generated when <a href="http://docbook.org/tdg5/en/html/partintro.html"><code class="sgmltag-element">partintro</code></a> is present.</span></pre></li><li class="listitem"><p><code class="literal">Jirka Kosek: xref.xsl</code></p><pre class="screen"><span class="commit-message">Footnotes can't be placed into fo:float</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: titlepage.templates.xml</code></p><pre class="screen"><span class="commit-message">Remove margin-left when start-indent is used because they interfere
|
||||
with each other.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: fo.xsl; pagesetup.xsl</code></p><pre class="screen"><span class="commit-message">Use dingbat.fontset rather than <a href="http://docbook.sourceforge.net/release/xsl/current/doc/fo/dingbat.font.family.html"><em class="parameter"><code>dingbat.font.family</code></em></a> so it falls
|
||||
back to <a href="http://docbook.org/tdg5/en/html/symbol.html"><code class="sgmltag-element">symbol</code></a> font if glyph not found, like other font properties.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: inline.xsl</code></p><pre class="screen"><span class="commit-message">Change last instance of inline.charseq in inline <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> to
|
||||
inline.italicseq so it is consistent with the others.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Make consistent handling of <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> in xrefs.</span></pre></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_HTML"></a>HTML</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">html</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">Robert Stayton: admon.xsl</code></p><pre class="screen"><span class="commit-message">Turn off $admon.style if $make.clean.html is set to non-zero.</span></pre></li><li class="listitem"><p><code class="literal">Jirka Kosek: highlight.xsl</code></p><pre class="screen"><span class="commit-message">Added new definitions for syntax highlighting</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: chunk-common.xsl</code></p><pre class="screen"><span class="commit-message">Make active.olink.hrefs param work for chunked output too.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: xref.xsl</code></p><pre class="screen"><span class="commit-message">Make consistent handling of <a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a> in xrefs.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: graphics.xsl</code></p><pre class="screen"><span class="commit-message">Add round() <a href="http://docbook.org/tdg5/en/html/function.html"><code class="sgmltag-element">function</code></a> when pixel counts are used for image width and height.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: glossary.xsl</code></p><pre class="screen"><span class="commit-message">fix missing class and id attributes on <a href="http://docbook.org/tdg5/en/html/glossterm.html"><code class="sgmltag-element">glossterm</code></a> and <a href="http://docbook.org/tdg5/en/html/glossdef.html"><code class="sgmltag-element">glossdef</code></a>.</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: autoidx.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug where prefer.index.titleabbrev ignored <a href="http://docbook.org/tdg5/en/html/info.html"><code class="sgmltag-element">info</code></a>/<a href="http://docbook.org/tdg5/en/html/titleabbrev.html"><code class="sgmltag-element">titleabbrev</code></a>.</span></pre></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_Manpages"></a>Manpages</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">manpages</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">Robert Stayton: utility.xsl</code></p><pre class="screen"><span class="commit-message">Fix bug 3599520: spurious newline in <a href="http://docbook.org/tdg5/en/html/para.html"><code class="sgmltag-element">para</code></a> when starts with
|
||||
whitespace and inline element.</span></pre></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_Webhelp"></a>Webhelp</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">webhelp</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">David Cramer: xsl/webhelp-common.xsl</code></p><pre class="screen"><span class="commit-message">Webhelp: Fix test for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/webhelp.include.search.tab.html"><em class="parameter"><code>webhelp.include.search.tab</code></em></a> param</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: Makefile.sample</code></p><pre class="screen"><span class="commit-message">Webhelp: Fix order of args to xsltproc</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: docsrc/readme.xml</code></p><pre class="screen"><span class="commit-message">Webhelp: Turn on xinclude-test.xml in readme to demo xinclude functionality</span></pre></li><li class="listitem"><p><code class="literal">David Cramer: Makefile; Makefile.sample</code></p><pre class="screen"><span class="commit-message">Webhelp: In Makefiles, do xinclude in first pass at document</span></pre></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_Params"></a>Params</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">params</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">David Cramer: webhelp.include.search.tab.xml</code></p><pre class="screen"><span class="commit-message">Webhelp: Fix test for <a href="http://docbook.sourceforge.net/release/xsl/current/doc/html/webhelp.include.search.tab.html"><em class="parameter"><code>webhelp.include.search.tab</code></em></a> param</span></pre></li><li class="listitem"><p><code class="literal">Robert Stayton: article.appendix.title.properties.xml</code></p><pre class="screen"><span class="commit-message">Remove unneeded margin-left property from <a href="http://docbook.org/tdg5/en/html/article.html"><code class="sgmltag-element">article</code></a> <a href="http://docbook.org/tdg5/en/html/appendix.html"><code class="sgmltag-element">appendix</code></a> <a href="http://docbook.org/tdg5/en/html/title.html"><code class="sgmltag-element">title</code></a>.
|
||||
It interferes with the start-indent property.</span></pre></li></ul></div></div><div class="sect2"><div class="titlepage"><div><div><h3 class="title"><a name="V1.78.1_Highlighting"></a>Highlighting</h3></div></div></div><p>The following changes have been made to the
|
||||
<code class="filename">highlighting</code> code
|
||||
since the 1.78.0 release.</p><div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem"><p><code class="literal">Jirka Kosek: c-hl.xml; cpp-hl.xml; sql2003-hl.xml; php-hl.xml; upc-hl.xml; bourne-hl.xml; ⋯</code></p><pre class="screen"><span class="commit-message">Added new definitions for syntax highlighting</span></pre></li></ul></div></div></div></div></body></html>
|
||||
|
|
@ -1,174 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
|
||||
<article>
|
||||
<info>
|
||||
<abstract>
|
||||
<para><emphasis role="strong">Note:</emphasis> This
|
||||
document lists changes only since the 1.78.0 release.
|
||||
If you instead want a record of the complete list of
|
||||
changes for the codebase over its entire history, you
|
||||
can obtain one by running the following commands:
|
||||
|
||||
<screen> <code>svn checkout https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl</code>
|
||||
<code>svn log --xml --verbose xsl > ChangeHistory.xml</code></screen></para>
|
||||
</abstract>
|
||||
</info><title>Changes since the 1.78.0 release</title>
|
||||
|
||||
<sect1 xml:id="V1.78.1">
|
||||
<title>Release Notes: 1.78.1</title>
|
||||
<para>The following is a list of changes that have been made
|
||||
since the 1.78.0 release.</para>
|
||||
|
||||
<sect2 xml:id="V1.78.1_Common">
|
||||
<title>Common</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>common</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">Make sure part and set <tag>titleabbrev</tag> are used in mode="titleabbrev.markup"</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">Add empty default template for <tag>titleabbrev</tag> since it is always processed in a mode.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: gentext.xsl</literal></para><screen><phrase role="commit-message">Make consistent handling of <tag>titleabbrev</tag> in xrefs.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: titles.xsl</literal></para><screen><phrase role="commit-message">for missing <tag>title</tag> in <tag>xref</tag>, provide parent information of target to help locate problem element.
|
||||
Process <tag>bridgehead</tag> in mode="title.markup", not normal mode.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Jirka Kosek: l10n.xsl</literal></para><screen><phrase role="commit-message">Fixed bug #3598963</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: gentext.xsl; labels.xsl</literal></para><screen><phrase role="commit-message">Make sure bridgeheads are not numbered in all contexts, including html <tag>title</tag> attributes.</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of Common changes for 1.78.1-->
|
||||
|
||||
<sect2 xml:id="V1.78.1_FO">
|
||||
<title>FO</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>fo</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: division.xsl</literal></para><screen><phrase role="commit-message">Fix bug where part <tag>TOC</tag> not generated when <tag>partintro</tag> is present.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Jirka Kosek: xref.xsl</literal></para><screen><phrase role="commit-message">Footnotes can't be placed into fo:float</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: titlepage.templates.xml</literal></para><screen><phrase role="commit-message">Remove margin-left when start-indent is used because they interfere
|
||||
with each other.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: fo.xsl; pagesetup.xsl</literal></para><screen><phrase role="commit-message">Use dingbat.fontset rather than <parameter>dingbat.font.family</parameter> so it falls
|
||||
back to <tag>symbol</tag> font if glyph not found, like other font properties.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: inline.xsl</literal></para><screen><phrase role="commit-message">Change last instance of inline.charseq in inline <tag>glossterm</tag> to
|
||||
inline.italicseq so it is consistent with the others.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Make consistent handling of <tag>titleabbrev</tag> in xrefs.</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of FO changes for 1.78.1-->
|
||||
|
||||
<sect2 xml:id="V1.78.1_HTML">
|
||||
<title>HTML</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>html</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: admon.xsl</literal></para><screen><phrase role="commit-message">Turn off $admon.style if $make.clean.html is set to non-zero.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Jirka Kosek: highlight.xsl</literal></para><screen><phrase role="commit-message">Added new definitions for syntax highlighting</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: chunk-common.xsl</literal></para><screen><phrase role="commit-message">Make active.olink.hrefs param work for chunked output too.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: xref.xsl</literal></para><screen><phrase role="commit-message">Make consistent handling of <tag>titleabbrev</tag> in xrefs.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: graphics.xsl</literal></para><screen><phrase role="commit-message">Add round() <tag>function</tag> when pixel counts are used for image width and height.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: glossary.xsl</literal></para><screen><phrase role="commit-message">fix missing class and id attributes on <tag>glossterm</tag> and <tag>glossdef</tag>.</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: autoidx.xsl</literal></para><screen><phrase role="commit-message">Fix bug where prefer.index.titleabbrev ignored <tag>info</tag>/<tag>titleabbrev</tag>.</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of HTML changes for 1.78.1-->
|
||||
|
||||
<sect2 xml:id="V1.78.1_Manpages">
|
||||
<title>Manpages</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>manpages</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: utility.xsl</literal></para><screen><phrase role="commit-message">Fix bug 3599520: spurious newline in <tag>para</tag> when starts with
|
||||
whitespace and inline element.</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of Manpages changes for 1.78.1-->
|
||||
|
||||
<sect2 xml:id="V1.78.1_Webhelp">
|
||||
<title>Webhelp</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>webhelp</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>David Cramer: xsl/webhelp-common.xsl</literal></para><screen><phrase role="commit-message">Webhelp: Fix test for <parameter>webhelp.include.search.tab</parameter> param</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>David Cramer: Makefile.sample</literal></para><screen><phrase role="commit-message">Webhelp: Fix order of args to xsltproc</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>David Cramer: docsrc/readme.xml</literal></para><screen><phrase role="commit-message">Webhelp: Turn on xinclude-test.xml in readme to demo xinclude functionality</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>David Cramer: Makefile; Makefile.sample</literal></para><screen><phrase role="commit-message">Webhelp: In Makefiles, do xinclude in first pass at document</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of Webhelp changes for 1.78.1-->
|
||||
|
||||
<sect2 xml:id="V1.78.1_Params">
|
||||
<title>Params</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>params</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>David Cramer: webhelp.include.search.tab.xml</literal></para><screen><phrase role="commit-message">Webhelp: Fix test for <parameter>webhelp.include.search.tab</parameter> param</phrase></screen>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>Robert Stayton: article.appendix.title.properties.xml</literal></para><screen><phrase role="commit-message">Remove unneeded margin-left property from <tag>article</tag> <tag>appendix</tag> <tag>title</tag>.
|
||||
It interferes with the start-indent property.</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of Params changes for 1.78.1-->
|
||||
|
||||
<sect2 xml:id="V1.78.1_Highlighting">
|
||||
<title>Highlighting</title>
|
||||
<para>The following changes have been made to the
|
||||
<filename>highlighting</filename> code
|
||||
since the 1.78.0 release.</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>Jirka Kosek: c-hl.xml; cpp-hl.xml; sql2003-hl.xml; php-hl.xml; upc-hl.xml; bourne-hl.xml; ⋯</literal></para><screen><phrase role="commit-message">Added new definitions for syntax highlighting</phrase></screen>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</sect2><!--end of Highlighting changes for 1.78.1-->
|
||||
|
||||
</sect1>
|
||||
</article>
|
||||
|
|
@ -1,175 +0,0 @@
|
|||
----------------------------------------------------------------------
|
||||
README file for the DocBook XSL Stylesheets
|
||||
----------------------------------------------------------------------
|
||||
$Id: README 9731 2013-03-17 05:01:54Z bobstayton $
|
||||
|
||||
These are XSL stylesheets for transforming DocBook XML document
|
||||
instances into various output formats.
|
||||
|
||||
This README file provides only very minimal documentation on using
|
||||
the stylesheets. For more complete information, see Bob Stayton's
|
||||
book "DocBook XSL: The Complete Guide", available online at:
|
||||
|
||||
http://www.sagehill.net/docbookxsl/
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Installation
|
||||
----------------------------------------------------------------------
|
||||
See the INSTALL file for information about installing this release.
|
||||
|
||||
----------------------------------------------------------------------
|
||||
How to use the stylesheets
|
||||
----------------------------------------------------------------------
|
||||
The base canonical URI for these stylesheets is:
|
||||
|
||||
http://docbook.sourceforge.net/release/xsl/current/
|
||||
|
||||
You call any of the stylesheets in this distribution by doing one
|
||||
of the following:
|
||||
|
||||
- Use the base canonical URI in combination with one of the
|
||||
pathnames below. For example, for "chunked" HTML, output:
|
||||
|
||||
http://docbook.sourceforge.net/release/xsl/current/html/chunk.xsl
|
||||
|
||||
If your system has a working XML Catalog or SGML Catalog setup
|
||||
(most Linux systems do), then that URI will automatically be
|
||||
resolved and replaced with a local pathname on your system.
|
||||
|
||||
- Use a "real" local system base path in combination with one of
|
||||
the pathnames below. For example, for "chunked" HTML, output:
|
||||
|
||||
/usr/share/xml/docbook/stylesheet/nwalsh/html/chunk.xsl
|
||||
|
||||
To transform documents created with the standard DocBook
|
||||
schema/DTD, use one of the following stylesheets:
|
||||
|
||||
fo/docbook.xsl - for XSL-FO
|
||||
|
||||
html/docbook.xsl - for HTML (as a single file)
|
||||
html/chunk.xsl - for HTML (chunked into multiple files)
|
||||
html/onechunk.xsl - for HTML (chunked output in single file)
|
||||
|
||||
xhtml/*.xsl - for XHTML versions of the above
|
||||
|
||||
xhtml-1_1/*.xsl - for XHTML 1.1 versions of the above
|
||||
|
||||
xhtml5/*.xsl - for XHTML5 versions of the above
|
||||
|
||||
epub/docbook.xsl - for .epub version 2 and earlier
|
||||
epub3/docbook.xsl - for .epub version 3 and later
|
||||
|
||||
htmlhelp/htmlhelp.xsl - for HTML Help
|
||||
javahelp/javahelp.xsl - for JavaHelp
|
||||
eclipse/eclipse.xsl - for Eclipse Help
|
||||
|
||||
manpages/docbook.xsl - for groff/nroff man pages
|
||||
|
||||
*/profile-* - single-pass-profiling versions of all above
|
||||
|
||||
roundtrip/*.xsl - for DocBook to WordML, etc., to DocBook
|
||||
|
||||
assembly/assemble.xsl - converts an assembly into a DocBook document
|
||||
assembly/topic-maker-chunk.xsl
|
||||
- converts a DocBook document into an assembly
|
||||
with topic files.
|
||||
|
||||
webhelp/build.xml - Ant script to generate webhelp output.
|
||||
webhelp/Makefile - Makefile to generate webhelp output.
|
||||
|
||||
To transform documents created with the DocBook Slides schema/DTD,
|
||||
use one of the following stylesheets:
|
||||
|
||||
slides/xhtml/*.xsl - for XHTML slides of various kinds
|
||||
slides/fo/plain.xsl - for XSL-FO slides
|
||||
|
||||
To transform documents created with the DocBook Website
|
||||
schema/DTD, use one of the following stylesheets:
|
||||
|
||||
website/website.xsl - for non-tabular, non-chunked output
|
||||
website/tabular.xsl - for tabular, non-chunked output
|
||||
website/chunk-* - for chunked output
|
||||
|
||||
To generate a titlepage customization layer from a titlepage spec:
|
||||
|
||||
template/titlepage.xsl
|
||||
|
||||
For fo titlepage customizations, set the stylesheet parameter named 'ns'
|
||||
to 'http://www.w3.org/1999/XSL/Format' when using this stylesheet.
|
||||
For xhtml titlepage customizations, set the stylesheet parameter named 'ns'
|
||||
to 'http://www.w3.org/1999/xhtml' when using this stylesheet.
|
||||
|
||||
For details about creating titlepage spec files and generating and
|
||||
using titlepage customization layers, see "DocBook XSL: The
|
||||
Complete Guide" <http://www.sagehill.net/docbookxsl/>
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Manifest
|
||||
----------------------------------------------------------------------
|
||||
AUTHORS contact information
|
||||
BUGS about known problems
|
||||
COPYING copyright information
|
||||
INSTALL installation instructions
|
||||
README this file
|
||||
RELEASE.* per-release cumulative summaries of user-visible changes
|
||||
TODO about planned features not yet implemented
|
||||
VERSION release metadata, including the current version
|
||||
number (note that the VERSION file is an XSL stylesheet)
|
||||
NEWS changes since the last public release (for a cumulative list of
|
||||
changes, see the ChangeHistory.xml file)
|
||||
|
||||
assembly/ for making and processing DocBook assemblies.
|
||||
common/ code used among several output formats (HTML, FO, manpages,...)
|
||||
docsrc/ documentation sources
|
||||
eclipse/ for producing Eclipse Help
|
||||
epub/ for producing .epub version 2.
|
||||
epub3/ for producing .epub version 3 and beyond.
|
||||
extensions/ DocBook XSL Java extensions
|
||||
fo/ for producing XSL-FO
|
||||
highlighting files used for adding source-code syntax highlighting in output
|
||||
html/ for producing HTML
|
||||
htmlhelp/ for producing HTML Help
|
||||
images/ images used in callouts and graphical admonitions
|
||||
javahelp/ for producing Java Help
|
||||
lib/ utility stylesheets with schema-independent functions
|
||||
manpages/ for producing groff/troff man pages
|
||||
profiling/ for profiling (omitting/including conditional text)
|
||||
roundtrip/ for "round trip" conversion among DocBook and
|
||||
various word-processor formats (WordML, etc.)
|
||||
slides/ for producing slides output (from Slides source)
|
||||
template/ templates for building stylesheet customization layers
|
||||
tools/ assorted supplementary tools
|
||||
webhelp/ templates and scripts for generating webhelp output
|
||||
website/ for producing website output (from Website source)
|
||||
xhtml/ for producing XHTML
|
||||
xhtml-1_1/ for producing (stricter) XHTML 1.1
|
||||
xhtml5/ for producing XHTML5
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Changes
|
||||
----------------------------------------------------------------------
|
||||
See the NEWS file for changes made since the previous release.
|
||||
|
||||
See the RELEASE-NOTES.html or RELEASE-NOTES.txt or RELEASE-NOTES.pdf
|
||||
files for per-release cumulative summaries of significant
|
||||
user-visible changes.
|
||||
|
||||
For online access to a hyperlinked view of all changes made over
|
||||
the entire history of the codebase, see the following:
|
||||
|
||||
http://docbook.svn.sourceforge.net/viewvc/docbook/trunk/xsl/?view=log
|
||||
|
||||
WARNING: That above change history is a very long list and may
|
||||
take a long time to load/download.
|
||||
|
||||
You can also create an XML-formatted "ChangeHistory.xml" copy of
|
||||
the complete change history for the codebase by running the
|
||||
following commands:
|
||||
|
||||
svn checkout https://docbook.svn.sf.net/svnroot/docbook/trunk/xsl
|
||||
svn log --xml --verbose xsl > ChangeHistory.xml
|
||||
|
||||
----------------------------------------------------------------------
|
||||
Copyright information
|
||||
----------------------------------------------------------------------
|
||||
See the accompanying file named COPYING.
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -1 +0,0 @@
|
|||
9732
|
|
@ -1,23 +0,0 @@
|
|||
The "to do" list for the DocBook Project XSL stylesheets is
|
||||
maintained at Sourceforge. To view a list of all open feature
|
||||
requests for the stylesheets:
|
||||
|
||||
http://docbook.sf.net/tracker/xsl/requests
|
||||
|
||||
To submit a feature request against the stylesheets:
|
||||
|
||||
http://docbook.sf.net/tracker/submit/request
|
||||
|
||||
To do a full-text search of all DocBook Project issues:
|
||||
|
||||
http://docbook.sf.net/tracker/search
|
||||
|
||||
Discussion about the DocBook Project XSL stylesheets takes place
|
||||
on the docbook-apps mailing list:
|
||||
|
||||
http://wiki.docbook.org/topic/DocBookAppsMailingList
|
||||
|
||||
Real-time discussion takes place on IRC:
|
||||
|
||||
http://wiki.docbook.org/topic/DocBookIrcChannel
|
||||
irc://irc.freenode.net/docbook
|
|
@ -1,115 +0,0 @@
|
|||
<?xml version='1.0'?> <!-- -*- nxml -*- vim: set foldlevel=2: -->
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:fm="http://freshmeat.net/projects/freshmeat-submit/"
|
||||
xmlns:sf="http://sourceforge.net/"
|
||||
xmlns:dyn="http://exslt.org/dynamic"
|
||||
xmlns:saxon="http://icl.com/saxon"
|
||||
exclude-result-prefixes="fm sf"
|
||||
version='1.0'>
|
||||
|
||||
<xsl:param name="get"/>
|
||||
<xsl:param name="VERSION" select="string(document('')//fm:Version[1])"/>
|
||||
<xsl:param name="Tag" select="concat('V',translate(string(document('')//fm:Version[1]),'.',''))"/>
|
||||
<xsl:param name="DistroTitle" select="string(document('')//fm:Branch[1])"/>
|
||||
<xsl:param name="sf-relid" select="0"/>
|
||||
|
||||
<xsl:param name="DistroName">docbook-xsl</xsl:param>
|
||||
<xsl:param name="PreviousRelease">1.78.0</xsl:param>
|
||||
<xsl:param name="PreviousReleaseRevision">9696</xsl:param>
|
||||
<xsl:param name="Revision">$Revision: 9731 $</xsl:param>
|
||||
<xsl:param name="VersionFileURL">$URL: https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl/VERSION $</xsl:param>
|
||||
|
||||
<xsl:strip-space elements="fm:*"/>
|
||||
|
||||
<fm:project>
|
||||
<fm:Project>DocBook</fm:Project>
|
||||
<fm:Branch>XSL Stylesheets</fm:Branch>
|
||||
<!-- * set/keep fm:version as N.NN.N-pre except for official releases, -->
|
||||
<!-- * then after the release, revert it to N.NN.N-pre & check back in -->
|
||||
<fm:Version>1.78.1</fm:Version>
|
||||
<!--
|
||||
<fm:License>MIT/X Consortium License</fm:License>
|
||||
-->
|
||||
<fm:Release-Focus>
|
||||
<!-- * Initial freshmeat announcement -->
|
||||
<!-- * Documentation -->
|
||||
<!-- * Code cleanup -->
|
||||
<!-- * Minor feature enhancements -->
|
||||
* Major feature enhancements
|
||||
<!-- * Minor bugfixes -->
|
||||
<!-- * Major bugfixes -->
|
||||
<!-- * Minor security fixes -->
|
||||
<!-- * Major security fixes -->
|
||||
</fm:Release-Focus>
|
||||
<fm:Home-Page-URL>http://sourceforge.net/projects/docbook/</fm:Home-Page-URL>
|
||||
<fm:Gzipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.tar.gz?download</fm:Gzipped-Tar-URL>
|
||||
<fm:Zipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.zip?download</fm:Zipped-Tar-URL>
|
||||
<fm:Bzipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.bz2?download</fm:Bzipped-Tar-URL>
|
||||
<fm:Changelog-URL>http://sourceforge.net/project/shownotes.php?release_id={SFRELID}</fm:Changelog-URL>
|
||||
<fm:CVS-URL>http://docbook.svn.sourceforge.net/viewvc/docbook/</fm:CVS-URL>
|
||||
<fm:Mailing-List-URL>http://lists.oasis-open.org/archives/docbook-apps/</fm:Mailing-List-URL>
|
||||
<fm:Changes>This is a release with bugfixes and some enhancements.</fm:Changes>
|
||||
</fm:project>
|
||||
|
||||
<xsl:template match="/" priority="-100">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$get = 'Tag'">
|
||||
<xsl:value-of select="$Tag"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'PreviousRelease'">
|
||||
<xsl:value-of select="$PreviousRelease"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'PreviousReleaseRevision'">
|
||||
<xsl:value-of select="$PreviousReleaseRevision"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'DistroTitle'">
|
||||
<xsl:value-of select="$DistroTitle"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'VERSION'">
|
||||
<xsl:value-of select="$VERSION"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="$sf-relid = 0">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>You must specify the sf-relid as a parameter.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select="//fm:project"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:project">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:apply-templates select="fm:Changes" mode="text"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:Changes"/>
|
||||
|
||||
<xsl:template match="fm:Gzipped-Tar-URL|fm:Zipped-Tar-URL|fm:Bzipped-Tar-URL">
|
||||
<xsl:value-of select="local-name(.)"/>
|
||||
<xsl:text>: </xsl:text>
|
||||
<xsl:value-of select="substring-before(., '{DISTRONAME-VERSION}')"/>
|
||||
<xsl:value-of select="concat($DistroName, '-', $VERSION)"/>
|
||||
<xsl:value-of select="substring-after(., '{DISTRONAME-VERSION}')"/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:Changelog-URL">
|
||||
<xsl:value-of select="local-name(.)"/>
|
||||
<xsl:text>: </xsl:text>
|
||||
<xsl:value-of select="substring-before(., '{SFRELID}')"/>
|
||||
<xsl:value-of select="$sf-relid"/>
|
||||
<xsl:value-of select="substring-after(., '{SFRELID}')"/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:*">
|
||||
<xsl:value-of select="local-name(.)"/>
|
||||
<xsl:text>: </xsl:text>
|
||||
<xsl:value-of select="normalize-space(.)"/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -1,115 +0,0 @@
|
|||
<?xml version='1.0'?> <!-- -*- nxml -*- vim: set foldlevel=2: -->
|
||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:fm="http://freshmeat.net/projects/freshmeat-submit/"
|
||||
xmlns:sf="http://sourceforge.net/"
|
||||
xmlns:dyn="http://exslt.org/dynamic"
|
||||
xmlns:saxon="http://icl.com/saxon"
|
||||
exclude-result-prefixes="fm sf"
|
||||
version='1.0'>
|
||||
|
||||
<xsl:param name="get"/>
|
||||
<xsl:param name="VERSION" select="string(document('')//fm:Version[1])"/>
|
||||
<xsl:param name="Tag" select="concat('V',translate(string(document('')//fm:Version[1]),'.',''))"/>
|
||||
<xsl:param name="DistroTitle" select="string(document('')//fm:Branch[1])"/>
|
||||
<xsl:param name="sf-relid" select="0"/>
|
||||
|
||||
<xsl:param name="DistroName">docbook-xsl</xsl:param>
|
||||
<xsl:param name="PreviousRelease">1.78.0</xsl:param>
|
||||
<xsl:param name="PreviousReleaseRevision">9696</xsl:param>
|
||||
<xsl:param name="Revision">$Revision: 9731 $</xsl:param>
|
||||
<xsl:param name="VersionFileURL">$URL: https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/xsl/VERSION $</xsl:param>
|
||||
|
||||
<xsl:strip-space elements="fm:*"/>
|
||||
|
||||
<fm:project>
|
||||
<fm:Project>DocBook</fm:Project>
|
||||
<fm:Branch>XSL Stylesheets</fm:Branch>
|
||||
<!-- * set/keep fm:version as N.NN.N-pre except for official releases, -->
|
||||
<!-- * then after the release, revert it to N.NN.N-pre & check back in -->
|
||||
<fm:Version>1.78.1</fm:Version>
|
||||
<!--
|
||||
<fm:License>MIT/X Consortium License</fm:License>
|
||||
-->
|
||||
<fm:Release-Focus>
|
||||
<!-- * Initial freshmeat announcement -->
|
||||
<!-- * Documentation -->
|
||||
<!-- * Code cleanup -->
|
||||
<!-- * Minor feature enhancements -->
|
||||
* Major feature enhancements
|
||||
<!-- * Minor bugfixes -->
|
||||
<!-- * Major bugfixes -->
|
||||
<!-- * Minor security fixes -->
|
||||
<!-- * Major security fixes -->
|
||||
</fm:Release-Focus>
|
||||
<fm:Home-Page-URL>http://sourceforge.net/projects/docbook/</fm:Home-Page-URL>
|
||||
<fm:Gzipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.tar.gz?download</fm:Gzipped-Tar-URL>
|
||||
<fm:Zipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.zip?download</fm:Zipped-Tar-URL>
|
||||
<fm:Bzipped-Tar-URL>http://prdownloads.sourceforge.net/docbook/{DISTRONAME-VERSION}.bz2?download</fm:Bzipped-Tar-URL>
|
||||
<fm:Changelog-URL>http://sourceforge.net/project/shownotes.php?release_id={SFRELID}</fm:Changelog-URL>
|
||||
<fm:CVS-URL>http://docbook.svn.sourceforge.net/viewvc/docbook/</fm:CVS-URL>
|
||||
<fm:Mailing-List-URL>http://lists.oasis-open.org/archives/docbook-apps/</fm:Mailing-List-URL>
|
||||
<fm:Changes>This is a release with bugfixes and some enhancements.</fm:Changes>
|
||||
</fm:project>
|
||||
|
||||
<xsl:template match="/" priority="-100">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$get = 'Tag'">
|
||||
<xsl:value-of select="$Tag"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'PreviousRelease'">
|
||||
<xsl:value-of select="$PreviousRelease"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'PreviousReleaseRevision'">
|
||||
<xsl:value-of select="$PreviousReleaseRevision"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'DistroTitle'">
|
||||
<xsl:value-of select="$DistroTitle"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$get = 'VERSION'">
|
||||
<xsl:value-of select="$VERSION"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:if test="$sf-relid = 0">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>You must specify the sf-relid as a parameter.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select="//fm:project"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:project">
|
||||
<xsl:apply-templates/>
|
||||
<xsl:text> </xsl:text>
|
||||
<xsl:apply-templates select="fm:Changes" mode="text"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:Changes"/>
|
||||
|
||||
<xsl:template match="fm:Gzipped-Tar-URL|fm:Zipped-Tar-URL|fm:Bzipped-Tar-URL">
|
||||
<xsl:value-of select="local-name(.)"/>
|
||||
<xsl:text>: </xsl:text>
|
||||
<xsl:value-of select="substring-before(., '{DISTRONAME-VERSION}')"/>
|
||||
<xsl:value-of select="concat($DistroName, '-', $VERSION)"/>
|
||||
<xsl:value-of select="substring-after(., '{DISTRONAME-VERSION}')"/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:Changelog-URL">
|
||||
<xsl:value-of select="local-name(.)"/>
|
||||
<xsl:text>: </xsl:text>
|
||||
<xsl:value-of select="substring-before(., '{SFRELID}')"/>
|
||||
<xsl:value-of select="$sf-relid"/>
|
||||
<xsl:value-of select="substring-after(., '{SFRELID}')"/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="fm:*">
|
||||
<xsl:value-of select="local-name(.)"/>
|
||||
<xsl:text>: </xsl:text>
|
||||
<xsl:value-of select="normalize-space(.)"/>
|
||||
<xsl:text> </xsl:text>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -1,195 +0,0 @@
|
|||
DocBook Assembly Stylesheets
|
||||
==============================
|
||||
bobs@sagehill.net
|
||||
|
||||
This directory provides XSL stylesheets for working with
|
||||
DocBook assemblies. It is intended to enable working with
|
||||
<topic> and <assembly> elements, as defined in DocBook 5.1
|
||||
and later.
|
||||
|
||||
This kit currently supports most features of an assembly.
|
||||
See the "Unsupported Features" section below for details
|
||||
of what is not currently supported. These more advanced
|
||||
features will be supported as it is further developed.
|
||||
|
||||
|
||||
Content of this directory:
|
||||
--------------------------
|
||||
topic-maker-chunk.xsl - stylesheet to modularize an existing DB5 document.
|
||||
topic-maker.xsl - imported by topic-maker-chunk.xsl.
|
||||
assemble.xsl - stylesheet to process an <assembly> into a document.
|
||||
|
||||
|
||||
The toolkit consists of an assemble.xsl XSL stylesheet
|
||||
to process a DocBook <assembly> element to convert it
|
||||
to an assembled DocBook 5 document ready to be formatted.
|
||||
This stylesheet will enable users to structure a book from
|
||||
modular files.
|
||||
|
||||
To make it easy to initially create a modular book, this
|
||||
kit also includes a topic-maker-chunk.xsl XSL stylesheet
|
||||
to break apart an existing DocBook 5 book into modular
|
||||
files, and also create the associated <assembly> document.
|
||||
Then you can run the assemble.xsl stylesheet to put it
|
||||
back together as a single DocBook document.
|
||||
|
||||
|
||||
To create an assembly and topic files from a book or article document
|
||||
=======================================================================
|
||||
|
||||
If you have an existing DocBook 5 book or article document,
|
||||
you can convert it to an assembly and a collection of
|
||||
modular topic files. If you want to convert a DocBook 4
|
||||
document, you must first convert it to version 5.
|
||||
|
||||
For example, to disassemble a DocBook 5 book document named book.xml:
|
||||
|
||||
xsltproc --xinclude \
|
||||
--stringparam assembly.filename myassembly.xml \
|
||||
--stringparam base.dir topics/ \
|
||||
topic-maker-chunk.xsl \
|
||||
mybook.xml
|
||||
|
||||
This command will result in a master assembly file named
|
||||
'myassembly.xml' with a root element of <assembly>, containing
|
||||
a single <structure> element. It will also break up the
|
||||
content of the book into modular chunks that are output
|
||||
to the 'topics/' subdirectory as specified in the 'base.dir'
|
||||
parameter.
|
||||
|
||||
Options
|
||||
----------
|
||||
The name of the assembly file is set by the stylesheet param
|
||||
named 'assembly.filename', which should include the filename suffix.
|
||||
|
||||
Modular files are output to the directory location specified
|
||||
by the 'base.dir' parameter. If you want them in the current
|
||||
directory, then don't set that param.
|
||||
|
||||
By default the assembly element is output to the current
|
||||
directory, *not* into base.dir with the modular files.
|
||||
The <resources> element in the assembly has its xml:base
|
||||
attribute set to the value of 'base.dir', so that it is
|
||||
added to the paths to the modular files when processed.
|
||||
If you set the stylesheet param 'manifest.in.base.dir'
|
||||
to 1, then the assembly file is created in the base.dir
|
||||
directory and the xml:base attribute is omitted (since
|
||||
they are together in the same directory).
|
||||
|
||||
If you want the assembly file in 'base.dir' instead of
|
||||
the current directory, then set the stylesheet param
|
||||
'manifest.in.base.dir' to 1.
|
||||
|
||||
The stylesheet chunks a document into modules at the
|
||||
same boundaries as the chunking XHTML stylesheet, because
|
||||
it reuses many of the chunking stylesheet templates.
|
||||
You can alter the chunking behavior with the same options
|
||||
as for XHTML chunking.
|
||||
|
||||
For example, the stylesheet will chunk sections into topics
|
||||
down to section level 3 by default. To change that level,
|
||||
change the stylesheet param 'chunk.section.depth' to
|
||||
another value.
|
||||
|
||||
Finer control of chunking can be achieved by using
|
||||
the <?dbhtml stop-chunking?> processing instruction in
|
||||
the source file.
|
||||
|
||||
Many modular elements retain their original element name,
|
||||
such as glossary, bibliography, index, and such. By default, the
|
||||
stylesheet converts chapter, article, preface and section elements
|
||||
into <topic> modules. To change that list of
|
||||
converted element names, alter the stylesheet param named
|
||||
'topic.elements'. If that param is empty, then no elements
|
||||
will be converted to <topic>, so they will all retain their
|
||||
original element names.
|
||||
|
||||
Modular filenames use the same naming scheme as the chunking
|
||||
XHTML stylesheet, and supports the same file naming options such as
|
||||
the param 'use.id.as.filename', which is set to 1 by default.
|
||||
Note that the stylesheet param 'html.ext' is set to '.xml'
|
||||
because it is producing modular XML files, not HTML files.
|
||||
|
||||
Root element conversion
|
||||
------------------------
|
||||
By default, the root element of the original document is
|
||||
also converted to a module, and <structure> gets a resourceref
|
||||
attribute to reference it. If you set the stylesheet
|
||||
param 'root.as.resourceref' to zero, then the root element
|
||||
is handled differently, as described as follows.
|
||||
|
||||
If the structure element does not have a resourcref
|
||||
attribute, the root element is constructed rather
|
||||
than copied from a resource. The structure element must
|
||||
have a renderas attribute (or its child output element must
|
||||
have such) to select the output root element name.
|
||||
|
||||
Any content between the root element start tag and the
|
||||
first module is put into a resource with the original
|
||||
root element. To pull this content in, the first
|
||||
module in the structure points to this resource but
|
||||
uses a contentonly="yes" attribute. The effect of
|
||||
that attribute is to pull in all content *except*
|
||||
the root element of that resource.
|
||||
|
||||
In general, if you have content that does not logically
|
||||
have its own container element, you can put the content
|
||||
into a suitable container element and then deselect the
|
||||
container element upon assembly with the contentonly="yes"
|
||||
attribute. That attribute can also be used to avoid
|
||||
pulling in a resource's xml:id when you want to change it.
|
||||
|
||||
|
||||
To process an <assembly> into an assembled DocBook document
|
||||
==============================================================
|
||||
|
||||
To convert an <assembly> and its associated modular
|
||||
files into a single DocBook document, process
|
||||
your assembly document with the assemble.xsl stylesheet.
|
||||
You should then be able to process the resulting
|
||||
document with a DocBook XSL formatting stylesheet.
|
||||
|
||||
|
||||
|
||||
|
||||
Useful params in assemble.xsl
|
||||
-----------------------------
|
||||
The $root.default.renderas param sets the name of the
|
||||
root element of the assembled document, if it is not
|
||||
otherwise specified with @renderas. Its default value
|
||||
is 'book'.
|
||||
|
||||
The $topic.default.renderas param sets the name of the
|
||||
output element for any topic element included in the
|
||||
assembly, if it is not otherwise specified with
|
||||
@renderas. It's default value is 'section'.
|
||||
|
||||
The $structure.id param lets you specify at runtime
|
||||
the id value of the structure you want to reassemble.
|
||||
This is only necessary if you have more than one
|
||||
structure element in your assembly.
|
||||
|
||||
The $output.type param also lets you specify at runtime
|
||||
which structure element to process. In this case,
|
||||
the value should match on an @type attribute on
|
||||
the structure element.
|
||||
|
||||
The $output.format param lets you specify at runtime
|
||||
which of several possible output formats are being generated.
|
||||
The param value is compared to the @format
|
||||
attribute on <output> elements to select specific properties
|
||||
for a module.
|
||||
|
||||
|
||||
|
||||
Unsupported Features
|
||||
-----------------------
|
||||
|
||||
The transforms and transform elements are currently ignored
|
||||
by the assembly stylesheet.
|
||||
|
||||
The relationships and relationship elements are currently
|
||||
ignored by the assembly stylesheet.
|
||||
|
||||
The filterin and filterout elements are not currently
|
||||
supported.
|
|
@ -1,677 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsl:stylesheet
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://docbook.org/ns/docbook"
|
||||
exclude-result-prefixes="exsl d xlink"
|
||||
version="1.0">
|
||||
|
||||
<!-- $Id: assemble.xsl,v 1.10 2012-04-10 07:56:58 bobs Exp $ -->
|
||||
|
||||
<xsl:preserve-space elements="*"/>
|
||||
<xsl:strip-space elements="d:assembly d:structure d:module d:resources d:resource"/>
|
||||
|
||||
<xsl:key name="id" match="*" use="@id|@xml:id"/>
|
||||
|
||||
|
||||
<xsl:param name="docbook.version">5.0</xsl:param>
|
||||
<xsl:param name="root.default.renderas">book</xsl:param>
|
||||
<xsl:param name="topic.default.renderas">section</xsl:param>
|
||||
|
||||
<xsl:param name="output.type" select="''"/>
|
||||
<xsl:param name="output.format" select="''"/>
|
||||
<!-- May be used to select one structure among several to process -->
|
||||
<xsl:param name="structure.id" select="''"/>
|
||||
|
||||
|
||||
<!-- default mode is to copy all content nodes -->
|
||||
<xsl:template match="node()|@*" priority="-5" mode="copycontent">
|
||||
<xsl:param name="omittitles"/>
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*" mode="copycontent"/>
|
||||
<xsl:apply-templates mode="copycontent">
|
||||
<xsl:with-param name="omittitles" select="$omittitles"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="processing-instruction('oxygen')"/>
|
||||
|
||||
<!-- skip assembly info elements -->
|
||||
<xsl:template match="d:info"/>
|
||||
|
||||
<!-- including for structure info element -->
|
||||
<xsl:template match="d:structure/d:info"/>
|
||||
|
||||
<!-- handle omittitles, but only top level title of resource -->
|
||||
<xsl:template match="/*/d:title
|
||||
| /*/d:info/d:title
|
||||
| /*/d:subtitle
|
||||
| /*/d:info/d:subtitle
|
||||
| /*/d:titleabbrev
|
||||
| /*/d:info/d:titleabbrev"
|
||||
mode="copycontent">
|
||||
<xsl:param name="omittitles"/>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="$omittitles = 'yes' or $omittitles = 'true' or $omittitles = '1'">
|
||||
<!-- omit it -->
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*" mode="copycontent"/>
|
||||
<xsl:apply-templates mode="copycontent"/>
|
||||
</xsl:copy>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- handled in a mode -->
|
||||
<xsl:template match="d:resources"/>
|
||||
<xsl:template match="d:output|d:filterin|d:filterout|d:merge|d:revhistory"/>
|
||||
<xsl:template match="d:output|d:filterin|d:filterout|d:merge|d:revhistory"
|
||||
mode="copycontent"/>
|
||||
|
||||
<xsl:template match="d:assembly">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$structure.id != ''">
|
||||
<xsl:variable name="id.structure" select="key('id', $structure.id)"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="count($id.structure) = 0">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: structure.id param set to '</xsl:text>
|
||||
<xsl:value-of select="$structure.id"/>
|
||||
<xsl:text>' but no element with that xml:id exists in assembly.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
<xsl:when test="local-name($id.structure) != 'structure'">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: structure.id param set to '</xsl:text>
|
||||
<xsl:value-of select="$structure.id"/>
|
||||
<xsl:text>' but no structure with that xml:id exists in assembly.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:apply-templates select="key('id', $structure.id)"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:when>
|
||||
<xsl:when test="$output.type != '' and not(d:structure[@type = $output.type])">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: output.type param set to '</xsl:text>
|
||||
<xsl:value-of select="$output.type"/>
|
||||
<xsl:text> but no structure element has that type attribute. Exiting.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
<xsl:when test="$output.type != '' and d:structure[@type = $output.type]">
|
||||
<xsl:apply-templates select="d:structure[@type = $output.type][1]"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<!-- otherwise process the first structure -->
|
||||
<xsl:apply-templates select="d:structure[1]"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:structure[not(@resourceref)]">
|
||||
|
||||
<xsl:variable name="output.root.element">
|
||||
<xsl:apply-templates select="." mode="compute.element.name"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:element name="{$output.root.element}" namespace="http://docbook.org/ns/docbook">
|
||||
<xsl:attribute name="version">
|
||||
<xsl:value-of select="$docbook.version"/>
|
||||
</xsl:attribute>
|
||||
<xsl:copy-of select="@xml:id"/>
|
||||
|
||||
<xsl:apply-templates>
|
||||
<xsl:with-param name="parent" select="$output.root.element"/>
|
||||
</xsl:apply-templates>
|
||||
|
||||
</xsl:element>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:glossary|d:bibliography|d:index|d:toc">
|
||||
<xsl:param name="parent" select="''"/>
|
||||
<xsl:apply-templates select="." mode="copycontent"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:title|d:titleabbrev|d:subtitle">
|
||||
<xsl:param name="parent" select="''"/>
|
||||
<xsl:apply-templates select="." mode="copycontent"/>
|
||||
</xsl:template>
|
||||
|
||||
<!-- module without a resourceref creates an element -->
|
||||
<xsl:template match="d:module[not(@resourceref)]">
|
||||
<xsl:param name="parent" select="''"/>
|
||||
|
||||
<xsl:variable name="module" select="."/>
|
||||
|
||||
<xsl:variable name="element.name">
|
||||
<xsl:apply-templates select="." mode="compute.element.name"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:element name="{$element.name}" namespace="http://docbook.org/ns/docbook">
|
||||
<xsl:choose>
|
||||
<!-- Use the module's xml:id if it has one -->
|
||||
<xsl:when test="@xml:id">
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:value-of select="@xml:id"/>
|
||||
</xsl:attribute>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:call-template name="merge.info">
|
||||
<xsl:with-param name="merge.element" select="$module/d:merge"/>
|
||||
</xsl:call-template>
|
||||
|
||||
<xsl:apply-templates>
|
||||
<xsl:with-param name="parent" select="$element.name"/>
|
||||
</xsl:apply-templates>
|
||||
|
||||
</xsl:element>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="compute.renderas">
|
||||
<xsl:variable name="output.value">
|
||||
<xsl:call-template name="compute.output.value">
|
||||
<xsl:with-param name="property">renderas</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:value-of select="$output.value"/>
|
||||
|
||||
</xsl:template>
|
||||
|
||||
<!-- This utility template is passed a value for output format
|
||||
and the name of a property and computes the value
|
||||
of the property from output children of context element -->
|
||||
<xsl:template name="compute.output.value">
|
||||
<xsl:param name="property" select="''"/>
|
||||
|
||||
<xsl:variable name="default.format"
|
||||
select="ancestor::d:structure/@defaultformat"/>
|
||||
|
||||
<xsl:variable name="property.value">
|
||||
<xsl:choose>
|
||||
<!-- if a child output element has a format that matches the param value
|
||||
and it has that property -->
|
||||
<!-- The format attribute can be multivalued -->
|
||||
<xsl:when test="$output.format != '' and
|
||||
d:output[contains(concat(' ', normalize-space(@format), ' '),
|
||||
$output.format)]
|
||||
[@*[local-name() = $property]]">
|
||||
<xsl:value-of
|
||||
select="d:output[contains(concat(' ', normalize-space(@format), ' '),
|
||||
$output.format)]
|
||||
[@*[local-name() = $property]][1]
|
||||
/@*[local-name() = $property]"/>
|
||||
</xsl:when>
|
||||
<!-- try with the structure's @defaultformat -->
|
||||
<xsl:when test="$default.format != '' and
|
||||
d:output[contains(concat(' ', normalize-space(@format), ' '),
|
||||
$default.format)]
|
||||
[@*[local-name() = $property]]">
|
||||
<xsl:value-of
|
||||
select="d:output[contains(concat(' ', normalize-space(@format), ' '),
|
||||
$default.format)]
|
||||
[@*[local-name() = $property]][1]
|
||||
/@*[local-name() = $property]"/>
|
||||
</xsl:when>
|
||||
<!-- try the first output with the property-->
|
||||
<xsl:when test="d:output[@*[local-name() = $property]]">
|
||||
<xsl:value-of
|
||||
select="d:output[@*[local-name() = $property]][1]
|
||||
/@*[local-name() = $property]"/>
|
||||
</xsl:when>
|
||||
<!-- and try the module element itself -->
|
||||
<xsl:when test="@*[local-name() = $property]">
|
||||
<xsl:value-of
|
||||
select="@*[local-name() = $property]"/>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:value-of select="$property.value"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:module[not(@resourceref)]" mode="compute.element.name">
|
||||
|
||||
<xsl:variable name="renderas">
|
||||
<xsl:call-template name="compute.renderas"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($renderas) != 0">
|
||||
<xsl:value-of select="$renderas"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: cannot determine output element name for </xsl:text>
|
||||
<xsl:text>module with no @resourceref and no @renderas. Exiting.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:module[@resourceref]" mode="compute.element.name">
|
||||
<xsl:param name="ref.name" select="''"/>
|
||||
|
||||
<xsl:variable name="renderas">
|
||||
<xsl:call-template name="compute.renderas"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($renderas) != 0">
|
||||
<xsl:value-of select="$renderas"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$ref.name = 'topic' and
|
||||
string-length($topic.default.renderas) != 0">
|
||||
<xsl:value-of select="$topic.default.renderas"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($ref.name) != 0">
|
||||
<xsl:value-of select="$ref.name"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: cannot determine output element name for </xsl:text>
|
||||
<xsl:text>@resourceref="</xsl:text>
|
||||
<xsl:value-of select="@resourceref"/>
|
||||
<xsl:text>". Exiting.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:structure" mode="compute.element.name">
|
||||
<xsl:param name="ref.name" select="''"/>
|
||||
|
||||
<xsl:variable name="renderas">
|
||||
<xsl:call-template name="compute.renderas"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($renderas) != 0">
|
||||
<xsl:value-of select="$renderas"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($ref.name) != 0">
|
||||
<xsl:value-of select="$ref.name"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="string-length($root.default.renderas) != 0">
|
||||
<xsl:value-of select="$root.default.renderas"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: cannot determine output element name for </xsl:text>
|
||||
<xsl:text>structure with no @renderas and no $root.default.renderas. </xsl:text>
|
||||
<xsl:text>Exiting.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:module[@resourceref] | d:structure[@resourceref]">
|
||||
<xsl:param name="parent" select="''"/>
|
||||
|
||||
<xsl:variable name="module" select="."/>
|
||||
<xsl:variable name="resourceref" select="@resourceref"/>
|
||||
<xsl:variable name="resource" select="key('id', $resourceref)"/>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="not($resource)">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: no xml:id matches @resourceref = '</xsl:text>
|
||||
<xsl:value-of select="$resourceref"/>
|
||||
<xsl:text>'.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
<xsl:when test="not($resource/self::d:resource)">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: xml:id matching @resourceref = '</xsl:text>
|
||||
<xsl:value-of select="$resourceref"/>
|
||||
<xsl:text> is not a resource element'.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:variable name="fileref.att" select="$resource/@fileref"/>
|
||||
|
||||
<xsl:variable name="fragment.id">
|
||||
<xsl:if test="contains($fileref.att, '#')">
|
||||
<xsl:value-of select="substring-after($fileref.att, '#')"/>
|
||||
</xsl:if>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="filename">
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($fragment.id) != 0">
|
||||
<xsl:value-of select="substring-before($fileref.att, '#')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$fileref.att"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="fileref">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$resource/ancestor::d:resources/@xml:base">
|
||||
<xsl:value-of
|
||||
select="concat($resource/ancestor::d:resources[@xml:base][1]/@xml:base,
|
||||
'/', $filename)"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$filename"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="string-length($fileref) = 0">
|
||||
<!-- A resource without @fileref gets its content copied -->
|
||||
<xsl:apply-templates select="$resource/node()" mode="copycontent"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
|
||||
<xsl:variable name="ref.file.content" select="document($fileref,/)"/>
|
||||
|
||||
<!-- selects root or fragmeht depending on if $fragment is blank -->
|
||||
<xsl:variable name="ref.content"
|
||||
select="$ref.file.content/*[1][$fragment.id = ''] |
|
||||
$ref.file.content/*[1][$fragment.id != '']/
|
||||
descendant-or-self::*[@xml:id = $fragment.id]"/>
|
||||
|
||||
<xsl:if test="count($ref.content) = 0">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: @fileref = '</xsl:text>
|
||||
<xsl:value-of select="$fileref"/>
|
||||
<xsl:text>' has no content or is unresolved.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:if>
|
||||
|
||||
<xsl:variable name="element.name">
|
||||
<xsl:apply-templates select="." mode="compute.element.name">
|
||||
<xsl:with-param name="ref.name" select="local-name($ref.content)"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="omittitles.property">
|
||||
<xsl:call-template name="compute.output.value">
|
||||
<xsl:with-param name="property">omittitles</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="contentonly.property">
|
||||
<xsl:call-template name="compute.output.value">
|
||||
<xsl:with-param name="property">contentonly</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="$contentonly.property = 'true' or
|
||||
$contentonly.property = 'yes' or
|
||||
$contentonly.property = '1'">
|
||||
<xsl:apply-templates select="$ref.content/node()" mode="copycontent">
|
||||
<xsl:with-param name="omittitles" select="$omittitles.property"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:when>
|
||||
<!-- use xsl:copy if using the ref element itself to get its namespaces -->
|
||||
<xsl:when test="$element.name = local-name($ref.content)">
|
||||
<!-- must use for-each to set context node for xsl:copy -->
|
||||
<xsl:for-each select="$ref.content">
|
||||
<xsl:copy>
|
||||
<xsl:copy-of select="@*[not(name() = 'xml:id')]"/>
|
||||
<xsl:choose>
|
||||
<!-- Use the module's xml:id if it has one -->
|
||||
<xsl:when test="$module/@xml:id">
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:value-of select="$module/@xml:id"/>
|
||||
</xsl:attribute>
|
||||
</xsl:when>
|
||||
<!-- otherwise use the resource's id -->
|
||||
<xsl:otherwise>
|
||||
<xsl:copy-of select="@xml:id"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:call-template name="merge.info">
|
||||
<xsl:with-param name="merge.element" select="$module/d:merge"/>
|
||||
<xsl:with-param name="ref.content" select="$ref.content"/>
|
||||
<xsl:with-param name="omittitles" select="$omittitles.property"/>
|
||||
</xsl:call-template>
|
||||
|
||||
<!-- copy through all but titles, which moved to info -->
|
||||
<xsl:apply-templates select="node()
|
||||
[not(local-name() = 'title') and
|
||||
not(local-name() = 'subtitle') and
|
||||
not(local-name() = 'info') and
|
||||
not(local-name() = 'titleabbrev')]" mode="copycontent"/>
|
||||
|
||||
<xsl:apply-templates select="$module/node()">
|
||||
<xsl:with-param name="parent" select="$element.name"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:copy>
|
||||
</xsl:for-each>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<!-- create the element instead of copying it -->
|
||||
<xsl:element name="{$element.name}" namespace="http://docbook.org/ns/docbook">
|
||||
<xsl:copy-of select="$ref.content/@*[not(name() = 'xml:id')]"/>
|
||||
<xsl:choose>
|
||||
<!-- Use the module's xml:id if it has one -->
|
||||
<xsl:when test="@xml:id">
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:value-of select="@xml:id"/>
|
||||
</xsl:attribute>
|
||||
</xsl:when>
|
||||
<!-- otherwise use the resource's id -->
|
||||
<xsl:when test="$ref.content/@xml:id">
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:value-of select="$ref.content/@xml:id"/>
|
||||
</xsl:attribute>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:call-template name="merge.info">
|
||||
<xsl:with-param name="merge.element" select="d:merge"/>
|
||||
<xsl:with-param name="ref.content" select="$ref.content"/>
|
||||
<xsl:with-param name="omittitles" select="$omittitles.property"/>
|
||||
</xsl:call-template>
|
||||
|
||||
<!-- copy through all but titles, which moved to info -->
|
||||
<xsl:apply-templates select="$ref.content/node()
|
||||
[not(local-name() = 'title') and
|
||||
not(local-name() = 'subtitle') and
|
||||
not(local-name() = 'info') and
|
||||
not(local-name() = 'titleabbrev')]" mode="copycontent"/>
|
||||
|
||||
<xsl:apply-templates>
|
||||
<xsl:with-param name="parent" select="$element.name"/>
|
||||
</xsl:apply-templates>
|
||||
</xsl:element>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="merge.info">
|
||||
<xsl:param name="merge.element" select="NOTANODE"/>
|
||||
<xsl:param name="ref.content" select="NOTANODE"/>
|
||||
<xsl:param name="omittitles"/>
|
||||
|
||||
<!-- a merge element may use resourceref as well as literal content -->
|
||||
<!-- any literal content overrides the merge resourceref content -->
|
||||
<xsl:variable name="merge.ref.content">
|
||||
<xsl:if test="$merge.element/@resourceref">
|
||||
<xsl:variable name="resourceref" select="$merge.element/@resourceref"/>
|
||||
<xsl:variable name="resource" select="key('id', $resourceref)"/>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="not($resource)">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: no xml:id matches @resourceref = '</xsl:text>
|
||||
<xsl:value-of select="$resourceref"/>
|
||||
<xsl:text>'.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
<xsl:when test="not($resource/self::d:resource)">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: xml:id matching @resourceref = '</xsl:text>
|
||||
<xsl:value-of select="$resourceref"/>
|
||||
<xsl:text> is not a resource element'.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:variable name="fileref.att" select="$resource/@fileref"/>
|
||||
|
||||
<xsl:variable name="fileref">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$resource/ancestor::d:resources/@xml:base">
|
||||
<xsl:value-of
|
||||
select="concat($resource/ancestor::d:resources[@xml:base][1]/@xml:base,
|
||||
'/', $fileref.att)"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$fileref.att"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:if test="string-length($fileref) != 0">
|
||||
<xsl:copy-of select="document($fileref,/)"/>
|
||||
</xsl:if>
|
||||
</xsl:if>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="merge.ref.info"
|
||||
select="exsl:node-set($merge.ref.content)//d:info[1]"/>
|
||||
|
||||
<xsl:if test="$merge.element/@resourceref and not($merge.ref.info)">
|
||||
<xsl:message terminate="yes">
|
||||
<xsl:text>ERROR: merge element with resourceref '</xsl:text>
|
||||
<xsl:value-of select="$merge.element/@resourceref"/>
|
||||
<xsl:text>' must point to something with an info element.'</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:if>
|
||||
|
||||
<xsl:variable name="omittitles.boolean">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$omittitles = 'yes' or $omittitles = 'true' or omittitles = '1'">
|
||||
<xsl:value-of select="1"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="0"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<!-- output info if there is any -->
|
||||
<xsl:if test="$merge.element/node() or
|
||||
$merge.ref.info/node() or
|
||||
$ref.content/d:info/node() or
|
||||
$ref.content/d:title[$omittitles.boolean = 0] or
|
||||
$ref.content/d:subtitle[$omittitles.boolean = 0] or
|
||||
$ref.content/d:titleabbrev[$omittitles.boolean = 0]">
|
||||
|
||||
<xsl:variable name="ref.info" select="$ref.content/d:info"/>
|
||||
<xsl:variable name="ref.title" select="$ref.content/d:title"/>
|
||||
<xsl:variable name="ref.subtitle" select="$ref.content/d:subtitle"/>
|
||||
<xsl:variable name="ref.titleabbrev" select="$ref.content/d:titleabbrev"/>
|
||||
<xsl:variable name="ref.info.title" select="$ref.content/d:info/d:title"/>
|
||||
<xsl:variable name="ref.info.subtitle" select="$ref.content/d:info/d:subtitle"/>
|
||||
<xsl:variable name="ref.info.titleabbrev" select="$ref.content/d:info/d:titleabbrev"/>
|
||||
|
||||
<info>
|
||||
<!-- First copy through any merge attributes and elements and comments -->
|
||||
<xsl:copy-of select="$merge.element/@*[not(local-name(.) = 'resourceref')]"/>
|
||||
|
||||
<!-- And copy any resource info attributes not in merge-->
|
||||
<xsl:for-each select="$ref.info/@*">
|
||||
<xsl:variable name="resource.att" select="local-name(.)"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$merge.element/@*[local-name(.) = $resource.att]">
|
||||
<!-- do nothing because overridden -->
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<!-- copy through if not overridden -->
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
|
||||
<!-- Copy through the merge children as they have highest priority -->
|
||||
<xsl:copy-of select="$merge.element/node()"/>
|
||||
|
||||
<!-- and copy through those merge resource elements not in merge element -->
|
||||
<xsl:for-each select="$merge.ref.info/node()">
|
||||
<xsl:variable name="resource.node" select="local-name(.)"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$merge.element/node()[local-name(.) = $resource.node]">
|
||||
<!-- do nothing because overridden -->
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<!-- copy through -->
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
|
||||
<!-- And copy any module's resource info node not in merge or merge.ref -->
|
||||
<xsl:for-each select="$ref.info/node() |
|
||||
$ref.title[$omittitles.boolean = 0] |
|
||||
$ref.subtitle[$omittitles.boolean = 0] |
|
||||
$ref.titleabbrev[$omittitles.boolean = 0] |
|
||||
$ref.info.title[$omittitles.boolean = 0] |
|
||||
$ref.info.subtitle[$omittitles.boolean = 0] |
|
||||
$ref.info.titleabbrev[$omittitles.boolean = 0]">
|
||||
<xsl:variable name="resource.node" select="local-name(.)"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$merge.element/node()[local-name(.) = $resource.node]">
|
||||
<!-- do nothing because overridden -->
|
||||
</xsl:when>
|
||||
<xsl:when test="$merge.ref.info/node()[local-name(.) = $resource.node]">
|
||||
<!-- do nothing because overridden -->
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<!-- copy through -->
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
|
||||
</info>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:relationships">
|
||||
<xsl:message>
|
||||
<xsl:text>WARNING: the <relationships> element is not currently </xsl:text>
|
||||
<xsl:text>supported by this stylesheet.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:transforms">
|
||||
<xsl:message>
|
||||
<xsl:text>WARNING: the <transforms> element is not currently </xsl:text>
|
||||
<xsl:text>supported by this stylesheet.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:filterin">
|
||||
<xsl:message>
|
||||
<xsl:text>WARNING: the <filterin> element is not currently </xsl:text>
|
||||
<xsl:text>supported by this stylesheet.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="d:filterout">
|
||||
<xsl:message>
|
||||
<xsl:text>WARNING: the <filterin> element is not currently </xsl:text>
|
||||
<xsl:text>supported by this stylesheet.</xsl:text>
|
||||
</xsl:message>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,221 +0,0 @@
|
|||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://docbook.org/ns/docbook"
|
||||
version="1.0"
|
||||
exclude-result-prefixes="exsl">
|
||||
|
||||
<!-- ********************************************************************
|
||||
$Id: topic-maker-chunk.xsl,v 1.7 2012-04-16 00:29:35 bobs Exp $
|
||||
********************************************************************
|
||||
-->
|
||||
|
||||
<xsl:import href="topic-maker.xsl"/>
|
||||
|
||||
<xsl:import href="../xhtml/chunk-common.xsl"/>
|
||||
|
||||
<xsl:include href="../xhtml/chunk-code.xsl"/>
|
||||
|
||||
<xsl:param name="root.id.suffix">-info</xsl:param>
|
||||
<xsl:param name="root.as.resourceref" select="1"/>
|
||||
|
||||
<xsl:template match="/" priority="1">
|
||||
<xsl:apply-templates select="/" mode="process.root"/>
|
||||
|
||||
<xsl:call-template name="make.assembly"/>
|
||||
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="chunk-element-content">
|
||||
<xsl:param name="content">
|
||||
<xsl:apply-imports/>
|
||||
</xsl:param>
|
||||
|
||||
<xsl:copy-of select="$content"/>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="make.assembly">
|
||||
<xsl:variable name="content">
|
||||
<assembly xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<xsl:call-template name="make.resources"/>
|
||||
<xsl:call-template name="make.structure"/>
|
||||
</assembly>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:variable name="filename">
|
||||
<xsl:if test="$manifest.in.base.dir != 0">
|
||||
<xsl:value-of select="$base.dir"/>
|
||||
</xsl:if>
|
||||
<xsl:value-of select="$assembly.filename"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:call-template name="write.chunk">
|
||||
<xsl:with-param name="content" select="$content"/>
|
||||
<xsl:with-param name="filename" select="$filename"/>
|
||||
<xsl:with-param name="indent">yes</xsl:with-param>
|
||||
</xsl:call-template>
|
||||
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="make.structure">
|
||||
<xsl:param name="root" select="/*[1]"/>
|
||||
|
||||
<xsl:param name="root.resourceref">
|
||||
<xsl:call-template name="object.id">
|
||||
<xsl:with-param name="object" select="$root"/>
|
||||
</xsl:call-template>
|
||||
</xsl:param>
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="$root.as.resourceref = 0">
|
||||
<structure>
|
||||
<xsl:attribute name="type">
|
||||
<xsl:value-of select="local-name($root)"/>
|
||||
</xsl:attribute>
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:value-of select="$root.resourceref"/>
|
||||
</xsl:attribute>
|
||||
|
||||
<xsl:copy-of select="($root/title | $root/info/title)[1]"/>
|
||||
|
||||
<!-- Put the title and info stuff in a content-only module -->
|
||||
<module resourceref="{$root.resourceref}{$root.id.suffix}" contentonly="true"/>
|
||||
<xsl:apply-templates select="$root/*" mode="module.list"/>
|
||||
</structure>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<structure>
|
||||
<xsl:attribute name="resourceref">
|
||||
<xsl:value-of select="$root.resourceref"/>
|
||||
</xsl:attribute>
|
||||
|
||||
<output renderas="{local-name($root)}"/>
|
||||
|
||||
<xsl:apply-templates select="$root/*" mode="module.list"/>
|
||||
</structure>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="*" mode="module.list">
|
||||
<xsl:variable name="is.chunk">
|
||||
<xsl:call-template name="chunk">
|
||||
<xsl:with-param name="node" select="."/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
|
||||
<!-- generate an output element for renderas? -->
|
||||
<xsl:variable name="src.element" select="concat(' ', local-name(.), ' ')"/>
|
||||
|
||||
<xsl:variable name="is.topic">
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($topic.list, $src.element)">1</xsl:when>
|
||||
<xsl:otherwise>0</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:if test="$is.chunk = 1">
|
||||
<module>
|
||||
<xsl:attribute name="resourceref">
|
||||
<xsl:call-template name="object.id"/>
|
||||
</xsl:attribute>
|
||||
|
||||
<xsl:if test="$is.topic = 1">
|
||||
<output renderas="{local-name()}"/>
|
||||
</xsl:if>
|
||||
|
||||
<xsl:apply-templates select="*" mode="module.list"/>
|
||||
</module>
|
||||
</xsl:if>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="make.resources">
|
||||
<resources>
|
||||
<!-- Add xml:base from $base.dir if manifest not in base.dir -->
|
||||
<xsl:if test="string-length($base.dir) != 0 and
|
||||
$manifest.in.base.dir = 0">
|
||||
<xsl:attribute name="xml:base">
|
||||
<!-- strip off trailing slash for xml:base -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="substring($base.dir, string-length($base.dir),1) = '/'">
|
||||
<xsl:value-of select="substring($base.dir, 1, string-length($base.dir) -1)"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$base.dir"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:attribute>
|
||||
</xsl:if>
|
||||
<xsl:apply-templates select="/*[1]" mode="resource.list"/>
|
||||
</resources>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="*" mode="resource.list">
|
||||
<xsl:variable name="is.chunk">
|
||||
<xsl:call-template name="chunk">
|
||||
<xsl:with-param name="node" select="."/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:if test="$is.chunk = 1">
|
||||
<resource>
|
||||
<xsl:attribute name="fileref">
|
||||
<!--
|
||||
<xsl:if test="$manifest.in.base.dir = 0">
|
||||
<xsl:value-of select="$base.dir"/>
|
||||
</xsl:if>
|
||||
-->
|
||||
<xsl:apply-templates select="." mode="chunk-filename"/>
|
||||
</xsl:attribute>
|
||||
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:call-template name="object.id"/>
|
||||
</xsl:attribute>
|
||||
|
||||
<xsl:variable name="title">
|
||||
<xsl:apply-templates select="." mode="title.markup"/>
|
||||
</xsl:variable>
|
||||
<xsl:if test="string-length($title) != 0">
|
||||
<description>
|
||||
<xsl:value-of select="$title"/>
|
||||
</description>
|
||||
</xsl:if>
|
||||
|
||||
</resource>
|
||||
</xsl:if>
|
||||
|
||||
<xsl:apply-templates select="*" mode="resource.list"/>
|
||||
</xsl:template>
|
||||
|
||||
<!-- special case for root id on structure element -->
|
||||
<xsl:template match="/*" mode="resource.list">
|
||||
<xsl:param name="root.resourceref">
|
||||
<xsl:call-template name="object.id">
|
||||
<xsl:with-param name="object" select="."/>
|
||||
</xsl:call-template>
|
||||
</xsl:param>
|
||||
|
||||
<resource>
|
||||
<xsl:attribute name="fileref">
|
||||
<xsl:apply-templates select="." mode="chunk-filename"/>
|
||||
</xsl:attribute>
|
||||
<xsl:attribute name="xml:id">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$root.as.resourceref = 0">
|
||||
<xsl:value-of select="concat($root.resourceref,$root.id.suffix)"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="$root.resourceref"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:attribute>
|
||||
</resource>
|
||||
<xsl:apply-templates select="*" mode="resource.list"/>
|
||||
</xsl:template>
|
||||
|
||||
<!-- This one must be here because of the template in chunk-code.xsl -->
|
||||
<xsl:template match="@fileref" priority="1">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
|
@ -1,78 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<xsl:stylesheet
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="http://exslt.org/common"
|
||||
xmlns="http://docbook.org/ns/docbook"
|
||||
exclude-result-prefixes="exsl"
|
||||
version="1.0">
|
||||
|
||||
<!-- $Id: topic-maker.xsl,v 1.3 2012-04-16 00:29:35 bobs Exp $ -->
|
||||
|
||||
<!-- This stylesheet convert DocBook elements into topic element.
|
||||
The chunking takes place elsewhere. -->
|
||||
|
||||
<xsl:import href="../xhtml/docbook.xsl"/>
|
||||
|
||||
|
||||
<xsl:param name="assembly.filename">myassembly.xml</xsl:param>
|
||||
<xsl:param name="chunk.section.depth" select="3"/>
|
||||
<xsl:param name="chunk.first.sections" select="1"/>
|
||||
<xsl:param name="use.id.as.filename" select="1"/>
|
||||
<xsl:param name="html.ext">.xml</xsl:param>
|
||||
<xsl:param name="base.dir">topics/</xsl:param>
|
||||
<xsl:param name="root.filename" select="local-name(/*)"/>
|
||||
<xsl:param name="html.extra.head.links" select="0"/>
|
||||
<xsl:param name="stylesheet.result.type">xhtml</xsl:param>
|
||||
<xsl:param name="navig.showtitles" select="0"/>
|
||||
<xsl:param name="suppress.navigation" select="1"/>
|
||||
<xsl:param name="chunk.append"/>
|
||||
<xsl:param name="chunk.quietly" select="0"/>
|
||||
<xsl:param name="chunker.output.method" select="'xml'"/>
|
||||
<xsl:param name="chunker.output.encoding" select="'UTF-8'"/>
|
||||
<xsl:param name="chunker.output.indent" select="'no'"/>
|
||||
<xsl:param name="chunker.output.omit-xml-declaration" select="'no'"/>
|
||||
<xsl:param name="chunker.output.standalone" select="'no'"/>
|
||||
<xsl:param name="chunker.output.doctype-public" select="''"/>
|
||||
<xsl:param name="chunker.output.doctype-system" select="''"/>
|
||||
<xsl:param name="namespace">http://docbook.org/ns/docbook</xsl:param>
|
||||
|
||||
<!-- These elements are converted to topic elements -->
|
||||
<xsl:param name="topic.elements">preface chapter article section</xsl:param>
|
||||
<xsl:variable name="topic.list"
|
||||
select="concat(' ', normalize-space($topic.elements), ' ')"/>
|
||||
|
||||
<!-- Default behavior is identity copy -->
|
||||
<xsl:template match="node()|@*">
|
||||
<xsl:copy>
|
||||
<xsl:apply-templates select="@*"/>
|
||||
<xsl:apply-templates/>
|
||||
</xsl:copy>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template match="preface|chapter|appendix|section|article">
|
||||
<xsl:variable name="element.name">
|
||||
<xsl:call-template name="element.name"/>
|
||||
</xsl:variable>
|
||||
|
||||
<xsl:element name="{$element.name}" namespace="{$namespace}">
|
||||
<xsl:apply-templates select="@*"/>
|
||||
<xsl:apply-templates/>
|
||||
</xsl:element>
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="element.name">
|
||||
<xsl:param name="node" select="."/>
|
||||
|
||||
<xsl:variable name="src.element" select="concat(' ', local-name($node), ' ')"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="contains($topic.list, $src.element)">
|
||||
<xsl:text>topic</xsl:text>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="local-name($node)"/>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<catalog xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
|
||||
<!-- XML Catalog file for DocBook XSL Stylesheets vsnapshot_9628 -->
|
||||
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/current/" rewritePrefix="./"/>
|
||||
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/current/" rewritePrefix="./"/>
|
||||
<rewriteURI uriStartString="http://docbook.sourceforge.net/release/xsl/snapshot_9628/" rewritePrefix="./"/>
|
||||
<rewriteSystem systemIdStartString="http://docbook.sourceforge.net/release/xsl/snapshot_9628/" rewritePrefix="./"/>
|
||||
</catalog>
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,702 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<l:l10n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0" language="as" english-language-name="Assamese">
|
||||
|
||||
<!-- * This file is generated automatically. -->
|
||||
<!-- * To submit changes to this file upstream (to the DocBook Project) -->
|
||||
<!-- * do not submit an edited version of this file. Instead, submit an -->
|
||||
<!-- * edited version of the source file at the following location: -->
|
||||
<!-- * -->
|
||||
<!-- * https://docbook.svn.sourceforge.net/svnroot/docbook/trunk/gentext/locale/as.xml -->
|
||||
<!-- * -->
|
||||
<!-- * E-mail the edited as.xml source file to: -->
|
||||
<!-- * -->
|
||||
<!-- * docbook-developers@lists.sourceforge.net -->
|
||||
|
||||
<!-- ******************************************************************** -->
|
||||
|
||||
<!-- This file is part of the XSL DocBook Stylesheet distribution. -->
|
||||
<!-- See ../README or http://docbook.sf.net/release/xsl/current/ for -->
|
||||
<!-- copyright and other information. -->
|
||||
|
||||
<!-- ******************************************************************** -->
|
||||
<!-- In these files, % with a letter is used for a placeholder: -->
|
||||
<!-- %t is the current element's title -->
|
||||
<!-- %s is the current element's subtitle (if applicable)-->
|
||||
<!-- %n is the current element's number label-->
|
||||
<!-- %p is the current element's page number (if applicable)-->
|
||||
<!-- ******************************************************************** -->
|
||||
|
||||
|
||||
<l:gentext key="Abstract" text="সাৰাংশ"/>
|
||||
<l:gentext key="abstract" text="সাৰাংশ"/>
|
||||
<l:gentext key="Acknowledgements" text="স্বীকৃতি"/>
|
||||
<l:gentext key="acknowledgements" text="স্বীকৃতি"/>
|
||||
<l:gentext key="Answer" text="উ:"/>
|
||||
<l:gentext key="answer" text="উ:"/>
|
||||
<l:gentext key="Appendix" text="পৰিশিষ্ট"/>
|
||||
<l:gentext key="appendix" text="পৰিশিষ্ট"/>
|
||||
<l:gentext key="Article" text="প্ৰবন্ধ"/>
|
||||
<l:gentext key="article" text="প্ৰবন্ধ"/>
|
||||
<l:gentext key="Author" text="লিখক"/>
|
||||
<l:gentext key="Bibliography" text="গ্ৰন্থসূচী"/>
|
||||
<l:gentext key="bibliography" text="গ্ৰন্থসূচী"/>
|
||||
<l:gentext key="Book" text="কিতাপ"/>
|
||||
<l:gentext key="book" text="কিতাপ"/>
|
||||
<l:gentext key="CAUTION" text="সাৱধান"/>
|
||||
<l:gentext key="Caution" text="সাৱধান"/>
|
||||
<l:gentext key="caution" text="সাৱধান"/>
|
||||
<l:gentext key="Chapter" text="অধ্যায়"/>
|
||||
<l:gentext key="chapter" text="অধ্যায়"/>
|
||||
<l:gentext key="Colophon" text="গ্ৰন্থপৰিচয়"/>
|
||||
<l:gentext key="colophon" text="গ্ৰন্থপৰিচয়"/>
|
||||
<l:gentext key="Copyright" text="স্বত্বাধিকাৰ"/>
|
||||
<l:gentext key="copyright" text="স্বত্বাধিকাৰ"/>
|
||||
<l:gentext key="Dedication" text="উসৰ্গা"/>
|
||||
<l:gentext key="dedication" text="উসৰ্গা"/>
|
||||
<l:gentext key="Edition" text="সংস্কৰণ"/>
|
||||
<l:gentext key="edition" text="সংস্কৰণ"/>
|
||||
<l:gentext key="Editor" text="সম্পাদক"/>
|
||||
<l:gentext key="Equation" text="সমীকৰণ"/>
|
||||
<l:gentext key="equation" text="সমীকৰণ"/>
|
||||
<l:gentext key="Example" text="উদাহৰণ"/>
|
||||
<l:gentext key="example" text="উদাহৰণ"/>
|
||||
<l:gentext key="Figure" text="ছবি"/>
|
||||
<l:gentext key="figure" text="ছবি"/>
|
||||
<l:gentext key="Glossary" text="শব্দকোষ"/>
|
||||
<l:gentext key="glossary" text="শব্দকোষ"/>
|
||||
<l:gentext key="GlossSee" text="চাওক"/>
|
||||
<l:gentext key="glosssee" text="চাওক"/>
|
||||
<l:gentext key="GlossSeeAlso" text="ইয়াকো চাওক"/>
|
||||
<l:gentext key="glossseealso" text="ইয়াকো চাওক"/>
|
||||
<l:gentext key="IMPORTANT" text="গুৰুত্বপূৰ্ণ"/>
|
||||
<l:gentext key="important" text="গুৰুত্বপূৰ্ণ"/>
|
||||
<l:gentext key="Important" text="গুৰুত্বপূৰ্ণ"/>
|
||||
<l:gentext key="Index" text="সূচী"/>
|
||||
<l:gentext key="index" text="সূচী"/>
|
||||
<l:gentext key="ISBN" text="ISBN"/>
|
||||
<l:gentext key="isbn" text="ISBN"/>
|
||||
<l:gentext key="LegalNotice" text="আইনসন্মত ঘোষণা"/>
|
||||
<l:gentext key="legalnotice" text="আইনসন্মত ঘোষণা"/>
|
||||
<l:gentext key="MsgAud" text="শ্ৰোতা"/>
|
||||
<l:gentext key="msgaud" text="শ্ৰোতা"/>
|
||||
<l:gentext key="MsgLevel" text="স্তৰ"/>
|
||||
<l:gentext key="msglevel" text="স্তৰ"/>
|
||||
<l:gentext key="MsgOrig" text="উৎস"/>
|
||||
<l:gentext key="msgorig" text="উৎস"/>
|
||||
<l:gentext key="NOTE" text="টোকা"/>
|
||||
<l:gentext key="Note" text="টোকা"/>
|
||||
<l:gentext key="note" text="টোকা"/>
|
||||
<l:gentext key="Part" text="অংশ"/>
|
||||
<l:gentext key="part" text="অংশ"/>
|
||||
<l:gentext key="Preface" text="পাতনি"/>
|
||||
<l:gentext key="preface" text="পাতনি"/>
|
||||
<l:gentext key="Procedure" text="প্ৰক্ৰিয়া"/>
|
||||
<l:gentext key="procedure" text="প্ৰক্ৰিয়া"/>
|
||||
<l:gentext key="ProductionSet" text="উৎপাদন"/>
|
||||
<l:gentext key="PubDate" text="প্ৰকাশনৰ দিন"/>
|
||||
<l:gentext key="pubdate" text="প্ৰকাশনৰ দিন"/>
|
||||
<l:gentext key="Published" text="প্ৰকাশিত"/>
|
||||
<l:gentext key="published" text="প্ৰকাশিত"/>
|
||||
<l:gentext key="Publisher" text="প্ৰকাশক"/>
|
||||
<l:gentext key="Qandadiv" text="প্ৰশ্ন & উত্তৰ"/>
|
||||
<l:gentext key="qandadiv" text="প্ৰশ্ন & উত্তৰ"/>
|
||||
<l:gentext key="QandASet" text="সঘনাই কৰা প্ৰশ্ন"/>
|
||||
<l:gentext key="Question" text="প্ৰ:"/>
|
||||
<l:gentext key="question" text="প্ৰ:"/>
|
||||
<l:gentext key="RefEntry" text="পৃষ্ঠা"/>
|
||||
<l:gentext key="refentry" text="পৃষ্ঠা"/>
|
||||
<l:gentext key="Reference" text="প্ৰসঙ্গ"/>
|
||||
<l:gentext key="reference" text="প্ৰসঙ্গ"/>
|
||||
<l:gentext key="References" text="প্ৰসঙ্গবোৰ"/>
|
||||
<l:gentext key="RefName" text="নাম"/>
|
||||
<l:gentext key="refname" text="নাম"/>
|
||||
<l:gentext key="RefSection" text="বিভাগ"/>
|
||||
<l:gentext key="refsection" text="বিভাগ"/>
|
||||
<l:gentext key="RefSynopsisDiv" text="সাৰাংশ"/>
|
||||
<l:gentext key="refsynopsisdiv" text="সাৰাংশ"/>
|
||||
<l:gentext key="RevHistory" text="পুনৰীক্ষণৰ ইতিহাস"/>
|
||||
<l:gentext key="revhistory" text="পুনৰীক্ষণৰ ইতিহাস"/>
|
||||
<l:gentext key="revision" text="পুনৰীক্ষণ"/>
|
||||
<l:gentext key="Revision" text="পুনৰীক্ষণ"/>
|
||||
<l:gentext key="sect1" text="বিভাগ"/>
|
||||
<l:gentext key="sect2" text="বিভাগ"/>
|
||||
<l:gentext key="sect3" text="বিভাগ"/>
|
||||
<l:gentext key="sect4" text="বিভাগ"/>
|
||||
<l:gentext key="sect5" text="বিভাগ"/>
|
||||
<l:gentext key="section" text="বিভাগ"/>
|
||||
<l:gentext key="Section" text="বিভাগ"/>
|
||||
<l:gentext key="see" text="চাওক"/>
|
||||
<l:gentext key="See" text="চাওক"/>
|
||||
<l:gentext key="seealso" text="ইয়াকো চাওক"/>
|
||||
<l:gentext key="Seealso" text="ইয়াকো চাওক"/>
|
||||
<l:gentext key="SeeAlso" text="ইয়াকো চাওক"/>
|
||||
<l:gentext key="set" text="গোট"/>
|
||||
<l:gentext key="Set" text="গোট"/>
|
||||
<l:gentext key="setindex" text="সূচী প্ৰতিষ্ঠা কৰক"/>
|
||||
<l:gentext key="SetIndex" text="সূচী প্ৰতিষ্ঠা কৰক"/>
|
||||
<l:gentext key="Sidebar" text="চাইডবাৰ"/>
|
||||
<l:gentext key="sidebar" text="চাইডবাৰ"/>
|
||||
<l:gentext key="step" text="পৰ্যায়"/>
|
||||
<l:gentext key="Step" text="পৰ্যায়"/>
|
||||
<l:gentext key="table" text="তালিকা"/>
|
||||
<l:gentext key="Table" text="তালিকা"/>
|
||||
<l:gentext key="task" text="কাৰ্য্য"/>
|
||||
<l:gentext key="Task" text="কাৰ্য্য"/>
|
||||
<l:gentext key="tip" text="সঙ্কেত"/>
|
||||
<l:gentext key="TIP" text="সঙ্কেত"/>
|
||||
<l:gentext key="Tip" text="সঙ্কেত"/>
|
||||
<l:gentext key="Warning" text="সকিয়নি"/>
|
||||
<l:gentext key="warning" text="সকিয়নি"/>
|
||||
<l:gentext key="WARNING" text="সকিয়নি"/>
|
||||
<l:gentext key="and" text="আৰু"/>
|
||||
<l:gentext key="or" text="or" lang="en"/>
|
||||
<l:gentext key="by" text="-ৰ দ্বাৰা"/>
|
||||
<l:gentext key="Edited" text="সম্পাদিত"/>
|
||||
<l:gentext key="edited" text="সম্পাদিত"/>
|
||||
<l:gentext key="Editedby" text="-ৰ দ্বাৰা সম্পাদিত"/>
|
||||
<l:gentext key="editedby" text="-ৰ দ্বাৰা সম্পাদিত"/>
|
||||
<l:gentext key="in" text="-ত"/>
|
||||
<l:gentext key="lastlistcomma" text=","/>
|
||||
<l:gentext key="listcomma" text=","/>
|
||||
<l:gentext key="notes" text="টোকা"/>
|
||||
<l:gentext key="Notes" text="টোকা"/>
|
||||
<l:gentext key="Pgs" text="পৃষ্ঠাসমূহ"/>
|
||||
<l:gentext key="pgs" text="পৃষ্ঠাসমূহ"/>
|
||||
<l:gentext key="Revisedby" text="পুনৰীক্ষণকৰ্তা:"/>
|
||||
<l:gentext key="revisedby" text="পুনৰীক্ষণকৰ্তা:"/>
|
||||
<l:gentext key="TableNotes" text="টোকা"/>
|
||||
<l:gentext key="tablenotes" text="টোকা"/>
|
||||
<l:gentext key="TableofContents" text="বিষয় সূচী"/>
|
||||
<l:gentext key="tableofcontents" text="বিষয় সূচী"/>
|
||||
<l:gentext key="unexpectedelementname" text="অপ্ৰত্যাশিত পদাৰ্থৰ নাম"/>
|
||||
<l:gentext key="unsupported" text="অসমৰ্থিত"/>
|
||||
<l:gentext key="xrefto" text="xref to"/>
|
||||
<l:gentext key="Authors" text="লিখকসমূহ"/>
|
||||
<l:gentext key="copyeditor" text="নকলৰ সম্পাদক"/>
|
||||
<l:gentext key="graphicdesigner" text="আলেখীৰ পৰিকল্পনাকৰ্তা"/>
|
||||
<l:gentext key="productioneditor" text="উৎপাদন সম্পাদক"/>
|
||||
<l:gentext key="technicaleditor" text="কাৰিকৰী সম্পাদক"/>
|
||||
<l:gentext key="translator" text="অনুবাদক"/>
|
||||
<l:gentext key="listofequations" text="সমীকৰণৰ তালিকা"/>
|
||||
<l:gentext key="ListofEquations" text="সমীকৰণৰ তালিকা"/>
|
||||
<l:gentext key="ListofExamples" text="উদাহৰণৰ তালিকা"/>
|
||||
<l:gentext key="listofexamples" text="উদাহৰণৰ তালিকা"/>
|
||||
<l:gentext key="ListofFigures" text="ছবিৰ তালিকা"/>
|
||||
<l:gentext key="listoffigures" text="ছবিৰ তালিকা"/>
|
||||
<l:gentext key="ListofProcedures" text="প্ৰক্ৰিয়াৰ তালিকা"/>
|
||||
<l:gentext key="listofprocedures" text="প্ৰক্ৰিয়াৰ তালিকা"/>
|
||||
<l:gentext key="listoftables" text="টেবুলৰ তালিকা"/>
|
||||
<l:gentext key="ListofTables" text="টেবুলৰ তালিকা"/>
|
||||
<l:gentext key="ListofUnknown" text="অজ্ঞাতৰ তালিকা"/>
|
||||
<l:gentext key="listofunknown" text="অজ্ঞাতৰ তালিকা"/>
|
||||
<l:gentext key="nav-home" text="আৰম্ভ"/>
|
||||
<l:gentext key="nav-next" text="পিছলৈ"/>
|
||||
<l:gentext key="nav-next-sibling" text="দ্ৰুতগতিৰে আগবাঢ়ক"/>
|
||||
<l:gentext key="nav-prev" text="আগৰ"/>
|
||||
<l:gentext key="nav-prev-sibling" text="দ্ৰুতগতিৰে পিছলৈ যাওক"/>
|
||||
<l:gentext key="nav-up" text="ওপৰলৈ"/>
|
||||
<l:gentext key="nav-toc" text="বিষয়বস্তুৰ তালিকা"/>
|
||||
<l:gentext key="Draft" text="ৰূপৰেখা"/>
|
||||
<l:gentext key="above" text="ওপৰত"/>
|
||||
<l:gentext key="below" text="তলত"/>
|
||||
<l:gentext key="sectioncalled" text="মাতি অনা বিভাগ"/>
|
||||
<l:gentext key="index symbols" text="চিহ্ন"/>
|
||||
<l:gentext key="writing-mode" text="lr-tb"/>
|
||||
<l:gentext key="lowercase.alpha" text="abcdefghijklmnopqrstuvwxyz" lang="en"/>
|
||||
<l:gentext key="uppercase.alpha" text="ABCDEFGHIJKLMNOPQRSTUVWXYZ" lang="en"/>
|
||||
<l:gentext key="normalize.sort.input" text="AaÀàÁáÂâÃãÄäÅåĀāĂ㥹ǍǎǞǟǠǡǺǻȀȁȂȃȦȧḀḁẚẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặBbƀƁɓƂƃḂḃḄḅḆḇCcÇçĆćĈĉĊċČčƇƈɕḈḉDdĎďĐđƊɗƋƌDžDzȡɖḊḋḌḍḎḏḐḑḒḓEeÈèÉéÊêËëĒēĔĕĖėĘęĚěȄȅȆȇȨȩḔḕḖḗḘḙḚḛḜḝẸẹẺẻẼẽẾếỀềỂểỄễỆệFfƑƒḞḟGgĜĝĞğĠġĢģƓɠǤǥǦǧǴǵḠḡHhĤĥĦħȞȟɦḢḣḤḥḦḧḨḩḪḫẖIiÌìÍíÎîÏïĨĩĪīĬĭĮįİƗɨǏǐȈȉȊȋḬḭḮḯỈỉỊịJjĴĵǰʝKkĶķƘƙǨǩḰḱḲḳḴḵLlĹĺĻļĽľĿŀŁłƚLjȴɫɬɭḶḷḸḹḺḻḼḽMmɱḾḿṀṁṂṃNnÑñŃńŅņŇňƝɲƞȠNjǸǹȵɳṄṅṆṇṈṉṊṋOoÒòÓóÔôÕõÖöØøŌōŎŏŐőƟƠơǑǒǪǫǬǭǾǿȌȍȎȏȪȫȬȭȮȯȰȱṌṍṎṏṐṑṒṓỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợPpƤƥṔṕṖṗQqʠRrŔŕŖŗŘřȐȑȒȓɼɽɾṘṙṚṛṜṝṞṟSsŚśŜŝŞşŠšȘșʂṠṡṢṣṤṥṦṧṨṩTtŢţŤťŦŧƫƬƭƮʈȚțȶṪṫṬṭṮṯṰṱẗUuÙùÚúÛûÜüŨũŪūŬŭŮůŰűŲųƯưǓǔǕǖǗǘǙǚǛǜȔȕȖȗṲṳṴṵṶṷṸṹṺṻỤụỦủỨứỪừỬửỮữỰựVvƲʋṼṽṾṿWwŴŵẀẁẂẃẄẅẆẇẈẉẘXxẊẋẌẍYyÝýÿŸŶŷƳƴȲȳẎẏẙỲỳỴỵỶỷỸỹZzŹźŻżŽžƵƶȤȥʐʑẐẑẒẓẔẕẕ" lang="en"/>
|
||||
<l:gentext key="normalize.sort.output" text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFGGGGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIJJJJJJKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLLLLLLLLLMMMMMMMMMNNNNNNNNNNNNNNNNNNNNNNNNNNNOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOPPPPPPPPQQQRRRRRRRRRRRRRRRRRRRRRRRSSSSSSSSSSSSSSSSSSSSSSSTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUVVVVVVVVWWWWWWWWWWWWWWWXXXXXXYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZ" lang="en"/>
|
||||
<l:dingbat key="startquote" text="“"/>
|
||||
<l:dingbat key="endquote" text="”"/>
|
||||
<l:dingbat key="nestedstartquote" text="‘"/>
|
||||
<l:dingbat key="nestedendquote" text="’"/>
|
||||
<l:dingbat key="singlestartquote" text="‘"/>
|
||||
<l:dingbat key="singleendquote" text="’"/>
|
||||
<l:dingbat key="bullet" text="•"/>
|
||||
<l:gentext key="hyphenation-character" text="-"/>
|
||||
<l:gentext key="hyphenation-push-character-count" text="2"/>
|
||||
<l:gentext key="hyphenation-remain-character-count" text="2"/>
|
||||
<l:context name="keycap"><l:template name="alt" text="Alt" lang="en"/>
|
||||
<l:template name="backspace" text="<—" lang="en"/>
|
||||
<l:template name="command" text="⌘" lang="en"/>
|
||||
<l:template name="control" text="Ctrl" lang="en"/>
|
||||
<l:template name="delete" text="Del" lang="en"/>
|
||||
<l:template name="down" text="↓" lang="en"/>
|
||||
<l:template name="end" text="End" lang="en"/>
|
||||
<l:template name="enter" text="Enter" lang="en"/>
|
||||
<l:template name="escape" text="Esc" lang="en"/>
|
||||
<l:template name="home" text="Home" lang="en"/>
|
||||
<l:template name="insert" text="Ins" lang="en"/>
|
||||
<l:template name="left" text="←" lang="en"/>
|
||||
<l:template name="meta" text="Meta" lang="en"/>
|
||||
<l:template name="option" text="???" lang="en"/>
|
||||
<l:template name="pagedown" text="Page ↓" lang="en"/>
|
||||
<l:template name="pageup" text="Page ↑" lang="en"/>
|
||||
<l:template name="right" text="→" lang="en"/>
|
||||
<l:template name="shift" text="Shift" lang="en"/>
|
||||
<l:template name="space" text="Space" lang="en"/>
|
||||
<l:template name="tab" text="→|" lang="en"/>
|
||||
<l:template name="up" text="↑" lang="en"/>
|
||||
</l:context>
|
||||
<l:context name="webhelp"><l:template name="Search" text="Search" lang="en"/>
|
||||
<l:template name="Enter_a_term_and_click" text="Enter a term and click " lang="en"/>
|
||||
<l:template name="Go" text="Go" lang="en"/>
|
||||
<l:template name="to_perform_a_search" text=" to perform a search." lang="en"/>
|
||||
<l:template name="txt_filesfound" text="Results" lang="en"/>
|
||||
<l:template name="txt_enter_at_least_1_char" text="You must enter at least one character." lang="en"/>
|
||||
<l:template name="txt_browser_not_supported" text="JavaScript is disabled on your browser. Please enable JavaScript to enjoy all the features of this site." lang="en"/>
|
||||
<l:template name="txt_please_wait" text="Please wait. Search in progress..." lang="en"/>
|
||||
<l:template name="txt_results_for" text="Results for: " lang="en"/>
|
||||
<l:template name="TableofContents" text="Contents" lang="en"/>
|
||||
<l:template name="HighlightButton" text="Toggle search result highlighting" lang="en"/>
|
||||
<l:template name="Your_search_returned_no_results" text="Your search returned no results." lang="en"/>
|
||||
</l:context>
|
||||
<l:context name="styles"><l:template name="person-name" text="first-last"/>
|
||||
</l:context>
|
||||
<l:context name="title"><l:template name="abstract" text="%t"/>
|
||||
<l:template name="acknowledgements" text="%t"/>
|
||||
<l:template name="answer" text="%t"/>
|
||||
<l:template name="appendix" text="পৰিশিষ্ট %n. %t"/>
|
||||
<l:template name="article" text="%t"/>
|
||||
<l:template name="authorblurb" text="%t"/>
|
||||
<l:template name="bibliodiv" text="%t"/>
|
||||
<l:template name="biblioentry" text="%t"/>
|
||||
<l:template name="bibliography" text="%t"/>
|
||||
<l:template name="bibliolist" text="%t"/>
|
||||
<l:template name="bibliomixed" text="%t"/>
|
||||
<l:template name="bibliomset" text="%t"/>
|
||||
<l:template name="biblioset" text="%t"/>
|
||||
<l:template name="blockquote" text="%t"/>
|
||||
<l:template name="book" text="%t"/>
|
||||
<l:template name="calloutlist" text="%t"/>
|
||||
<l:template name="caution" text="%t"/>
|
||||
<l:template name="chapter" text="অধ্যায় %n. %t"/>
|
||||
<l:template name="colophon" text="%t"/>
|
||||
<l:template name="dedication" text="%t"/>
|
||||
<l:template name="equation" text="সমীকৰণ %n. %t"/>
|
||||
<l:template name="example" text="উদাহৰণ %n. %t"/>
|
||||
<l:template name="figure" text="ছবি %n. %t"/>
|
||||
<l:template name="foil" text="%t"/>
|
||||
<l:template name="foilgroup" text="%t"/>
|
||||
<l:template name="formalpara" text="%t"/>
|
||||
<l:template name="glossary" text="%t"/>
|
||||
<l:template name="glossdiv" text="%t"/>
|
||||
<l:template name="glosslist" text="%t"/>
|
||||
<l:template name="glossentry" text="%t"/>
|
||||
<l:template name="important" text="%t"/>
|
||||
<l:template name="index" text="%t"/>
|
||||
<l:template name="indexdiv" text="%t"/>
|
||||
<l:template name="itemizedlist" text="%t"/>
|
||||
<l:template name="legalnotice" text="%t"/>
|
||||
<l:template name="listitem" text=""/>
|
||||
<l:template name="lot" text="%t"/>
|
||||
<l:template name="msg" text="%t"/>
|
||||
<l:template name="msgexplan" text="%t"/>
|
||||
<l:template name="msgmain" text="%t"/>
|
||||
<l:template name="msgrel" text="%t"/>
|
||||
<l:template name="msgset" text="%t"/>
|
||||
<l:template name="msgsub" text="%t"/>
|
||||
<l:template name="note" text="%t"/>
|
||||
<l:template name="orderedlist" text="%t"/>
|
||||
<l:template name="part" text="অংশ %n. %t"/>
|
||||
<l:template name="partintro" text="%t"/>
|
||||
<l:template name="preface" text="%t"/>
|
||||
<l:template name="procedure" text="%t"/>
|
||||
<l:template name="procedure.formal" text="প্ৰক্ৰিয়া %n. %t"/>
|
||||
<l:template name="productionset" text="%t"/>
|
||||
<l:template name="productionset.formal" text="উৎপাদন %n"/>
|
||||
<l:template name="qandadiv" text="%t"/>
|
||||
<l:template name="qandaentry" text="%t"/>
|
||||
<l:template name="qandaset" text="%t"/>
|
||||
<l:template name="question" text="%t"/>
|
||||
<l:template name="refentry" text="%t"/>
|
||||
<l:template name="reference" text="%t"/>
|
||||
<l:template name="refsection" text="%t"/>
|
||||
<l:template name="refsect1" text="%t"/>
|
||||
<l:template name="refsect2" text="%t"/>
|
||||
<l:template name="refsect3" text="%t"/>
|
||||
<l:template name="refsynopsisdiv" text="%t"/>
|
||||
<l:template name="refsynopsisdivinfo" text="%t"/>
|
||||
<l:template name="screenshot" text="%t" lang="en"/>
|
||||
<l:template name="segmentedlist" text="%t"/>
|
||||
<l:template name="set" text="%t"/>
|
||||
<l:template name="setindex" text="%t"/>
|
||||
<l:template name="sidebar" text="%t"/>
|
||||
<l:template name="step" text="%t"/>
|
||||
<l:template name="table" text="তালিকা %n. %t"/>
|
||||
<l:template name="task" text="%t"/>
|
||||
<l:template name="tasksummary" text="%t"/>
|
||||
<l:template name="taskprerequisites" text="%t"/>
|
||||
<l:template name="taskrelated" text="%t"/>
|
||||
<l:template name="tip" text="%t"/>
|
||||
<l:template name="toc" text="%t"/>
|
||||
<l:template name="variablelist" text="%t"/>
|
||||
<l:template name="varlistentry" text=""/>
|
||||
<l:template name="warning" text="%t"/>
|
||||
</l:context>
|
||||
<l:context name="title-unnumbered"><l:template name="appendix" text="%t"/>
|
||||
<l:template name="article/appendix" text="%t"/>
|
||||
<l:template name="bridgehead" text="%t"/>
|
||||
<l:template name="chapter" text="%t"/>
|
||||
<l:template name="sect1" text="%t"/>
|
||||
<l:template name="sect2" text="%t"/>
|
||||
<l:template name="sect3" text="%t"/>
|
||||
<l:template name="sect4" text="%t"/>
|
||||
<l:template name="sect5" text="%t"/>
|
||||
<l:template name="section" text="%t"/>
|
||||
<l:template name="simplesect" text="%t"/>
|
||||
<l:template name="topic" text="%t" lang="en"/>
|
||||
<l:template name="part" text="%t"/>
|
||||
</l:context>
|
||||
<l:context name="title-numbered"><l:template name="appendix" text="পৰিশিষ্ট %n. %t"/>
|
||||
<l:template name="article/appendix" text="%n. %t"/>
|
||||
<l:template name="bridgehead" text="%n. %t"/>
|
||||
<l:template name="chapter" text="অধ্যায় %n. %t"/>
|
||||
<l:template name="part" text="অংশ %n. %t"/>
|
||||
<l:template name="sect1" text="%n. %t"/>
|
||||
<l:template name="sect2" text="%n. %t"/>
|
||||
<l:template name="sect3" text="%n. %t"/>
|
||||
<l:template name="sect4" text="%n. %t"/>
|
||||
<l:template name="sect5" text="%n. %t"/>
|
||||
<l:template name="section" text="%n. %t"/>
|
||||
<l:template name="simplesect" text="%t"/>
|
||||
<l:template name="topic" text="%t" lang="en"/>
|
||||
</l:context>
|
||||
<l:context name="subtitle"><l:template name="appendix" text="%s"/>
|
||||
<l:template name="acknowledgements" text="%s"/>
|
||||
<l:template name="article" text="%s"/>
|
||||
<l:template name="bibliodiv" text="%s"/>
|
||||
<l:template name="biblioentry" text="%s"/>
|
||||
<l:template name="bibliography" text="%s"/>
|
||||
<l:template name="bibliomixed" text="%s"/>
|
||||
<l:template name="bibliomset" text="%s"/>
|
||||
<l:template name="biblioset" text="%s"/>
|
||||
<l:template name="book" text="%s"/>
|
||||
<l:template name="chapter" text="%s"/>
|
||||
<l:template name="colophon" text="%s"/>
|
||||
<l:template name="dedication" text="%s"/>
|
||||
<l:template name="glossary" text="%s"/>
|
||||
<l:template name="glossdiv" text="%s"/>
|
||||
<l:template name="index" text="%s"/>
|
||||
<l:template name="indexdiv" text="%s"/>
|
||||
<l:template name="lot" text="%s"/>
|
||||
<l:template name="part" text="%s"/>
|
||||
<l:template name="partintro" text="%s"/>
|
||||
<l:template name="preface" text="%s"/>
|
||||
<l:template name="refentry" text="%s"/>
|
||||
<l:template name="reference" text="%s"/>
|
||||
<l:template name="refsection" text="%s"/>
|
||||
<l:template name="refsect1" text="%s"/>
|
||||
<l:template name="refsect2" text="%s"/>
|
||||
<l:template name="refsect3" text="%s"/>
|
||||
<l:template name="refsynopsisdiv" text="%s"/>
|
||||
<l:template name="sect1" text="%s"/>
|
||||
<l:template name="sect2" text="%s"/>
|
||||
<l:template name="sect3" text="%s"/>
|
||||
<l:template name="sect4" text="%s"/>
|
||||
<l:template name="sect5" text="%s"/>
|
||||
<l:template name="section" text="%s"/>
|
||||
<l:template name="set" text="%s"/>
|
||||
<l:template name="setindex" text="%s"/>
|
||||
<l:template name="sidebar" text="%s"/>
|
||||
<l:template name="simplesect" text="%s"/>
|
||||
<l:template name="topic" text="%t" lang="en"/>
|
||||
<l:template name="toc" text="%s"/>
|
||||
</l:context>
|
||||
<l:context name="xref"><l:template name="abstract" text="%t"/>
|
||||
<l:template name="acknowledgements" text="%t"/>
|
||||
<l:template name="answer" text="উ: %n"/>
|
||||
<l:template name="appendix" text="%t"/>
|
||||
<l:template name="article" text="%t"/>
|
||||
<l:template name="authorblurb" text="%t"/>
|
||||
<l:template name="bibliodiv" text="%t"/>
|
||||
<l:template name="bibliography" text="%t"/>
|
||||
<l:template name="bibliomset" text="%t"/>
|
||||
<l:template name="biblioset" text="%t"/>
|
||||
<l:template name="blockquote" text="%t"/>
|
||||
<l:template name="book" text="%t"/>
|
||||
<l:template name="calloutlist" text="%t"/>
|
||||
<l:template name="caution" text="%t"/>
|
||||
<l:template name="chapter" text="%t"/>
|
||||
<l:template name="colophon" text="%t"/>
|
||||
<l:template name="constraintdef" text="%t"/>
|
||||
<l:template name="dedication" text="%t"/>
|
||||
<l:template name="equation" text="%t"/>
|
||||
<l:template name="example" text="%t"/>
|
||||
<l:template name="figure" text="%t"/>
|
||||
<l:template name="foil" text="%t"/>
|
||||
<l:template name="foilgroup" text="%t"/>
|
||||
<l:template name="formalpara" text="%t"/>
|
||||
<l:template name="glossary" text="%t"/>
|
||||
<l:template name="glossdiv" text="%t"/>
|
||||
<l:template name="important" text="%t"/>
|
||||
<l:template name="index" text="%t"/>
|
||||
<l:template name="indexdiv" text="%t"/>
|
||||
<l:template name="itemizedlist" text="%t"/>
|
||||
<l:template name="legalnotice" text="%t"/>
|
||||
<l:template name="listitem" text="%n"/>
|
||||
<l:template name="lot" text="%t"/>
|
||||
<l:template name="msg" text="%t"/>
|
||||
<l:template name="msgexplan" text="%t"/>
|
||||
<l:template name="msgmain" text="%t"/>
|
||||
<l:template name="msgrel" text="%t"/>
|
||||
<l:template name="msgset" text="%t"/>
|
||||
<l:template name="msgsub" text="%t"/>
|
||||
<l:template name="note" text="%t"/>
|
||||
<l:template name="orderedlist" text="%t"/>
|
||||
<l:template name="part" text="%t"/>
|
||||
<l:template name="partintro" text="%t"/>
|
||||
<l:template name="preface" text="%t"/>
|
||||
<l:template name="procedure" text="%t"/>
|
||||
<l:template name="productionset" text="%t"/>
|
||||
<l:template name="qandadiv" text="%t"/>
|
||||
<l:template name="qandaentry" text="প্ৰ: %n"/>
|
||||
<l:template name="qandaset" text="%t"/>
|
||||
<l:template name="question" text="প্ৰ: %n"/>
|
||||
<l:template name="reference" text="%t"/>
|
||||
<l:template name="refsynopsisdiv" text="%t"/>
|
||||
<l:template name="screenshot" text="%t" lang="en"/>
|
||||
<l:template name="segmentedlist" text="%t"/>
|
||||
<l:template name="set" text="%t"/>
|
||||
<l:template name="setindex" text="%t"/>
|
||||
<l:template name="sidebar" text="%t"/>
|
||||
<l:template name="table" text="%t"/>
|
||||
<l:template name="task" text="%t"/>
|
||||
<l:template name="tip" text="%t"/>
|
||||
<l:template name="toc" text="%t"/>
|
||||
<l:template name="variablelist" text="%t"/>
|
||||
<l:template name="varlistentry" text="%n"/>
|
||||
<l:template name="warning" text="%t"/>
|
||||
<l:template name="olink.document.citation" text=" in %o"/>
|
||||
<l:template name="olink.page.citation" text=" (page %p)"/>
|
||||
<l:template name="page.citation" text=" [%p]"/>
|
||||
<l:template name="page" text="(page %p)"/>
|
||||
<l:template name="docname" text=" in %o"/>
|
||||
<l:template name="docnamelong" text=" in the document titled %o"/>
|
||||
<l:template name="pageabbrev" text="(p. %p)"/>
|
||||
<l:template name="Page" text="Page %p"/>
|
||||
<l:template name="topic" text="%t" lang="en"/>
|
||||
<l:template name="bridgehead" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsection" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsect1" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsect2" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsect3" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="sect1" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="sect2" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="sect3" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="sect4" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="sect5" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="section" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="simplesect" text="মাতি অনা বিভাগ “%t”"/>
|
||||
</l:context>
|
||||
<l:context name="xref-number"><l:template name="answer" text="উ: %n"/>
|
||||
<l:template name="appendix" text="পৰিশিষ্ট %n"/>
|
||||
<l:template name="bridgehead" text="বিভাগ %n"/>
|
||||
<l:template name="chapter" text="অধ্যায় %n"/>
|
||||
<l:template name="equation" text="সমীকৰণ %n"/>
|
||||
<l:template name="example" text="উদাহৰণ %n"/>
|
||||
<l:template name="figure" text="ছবি %n"/>
|
||||
<l:template name="part" text="অংশ %n"/>
|
||||
<l:template name="procedure" text="প্ৰক্ৰিয়া %n"/>
|
||||
<l:template name="productionset" text="উৎপাদন %n"/>
|
||||
<l:template name="qandadiv" text="প্ৰশ্ন & উত্তৰ %n"/>
|
||||
<l:template name="qandaentry" text="প্ৰ: %n"/>
|
||||
<l:template name="question" text="প্ৰ: %n"/>
|
||||
<l:template name="sect1" text="বিভাগ %n"/>
|
||||
<l:template name="sect2" text="বিভাগ %n"/>
|
||||
<l:template name="sect3" text="বিভাগ %n"/>
|
||||
<l:template name="sect4" text="বিভাগ %n"/>
|
||||
<l:template name="sect5" text="বিভাগ %n"/>
|
||||
<l:template name="section" text="বিভাগ %n"/>
|
||||
<l:template name="table" text="তালিকা %n"/>
|
||||
</l:context>
|
||||
<l:context name="xref-number-and-title"><l:template name="appendix" text="পৰিশিষ্ট %n, %t"/>
|
||||
<l:template name="bridgehead" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="chapter" text="অধ্যায় %n, %t"/>
|
||||
<l:template name="equation" text="সমীকৰণ %n, “%t”"/>
|
||||
<l:template name="example" text="উদাহৰণ %n, “%t”"/>
|
||||
<l:template name="figure" text="ছবি %n, “%t”"/>
|
||||
<l:template name="part" text="অংশ %n, “%t”"/>
|
||||
<l:template name="procedure" text="প্ৰক্ৰিয়া %n, “%t”"/>
|
||||
<l:template name="productionset" text="উৎপাদন %n, “%t”"/>
|
||||
<l:template name="qandadiv" text="প্ৰশ্ন & উত্তৰ %n, “%t”"/>
|
||||
<l:template name="refsect1" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsect2" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsect3" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="refsection" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="sect1" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="sect2" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="sect3" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="sect4" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="sect5" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="section" text="বিভাগ %n, “%t”"/>
|
||||
<l:template name="simplesect" text="মাতি অনা বিভাগ “%t”"/>
|
||||
<l:template name="table" text="তালিকা %n, “%t”"/>
|
||||
</l:context>
|
||||
<l:context name="authorgroup"><l:template name="sep" text=", "/>
|
||||
<l:template name="sep2" text=" আৰু "/>
|
||||
<l:template name="seplast" text=", আৰু "/>
|
||||
</l:context>
|
||||
<l:context name="glossary"><l:template name="see" text="চাওক %t."/>
|
||||
<l:template name="seealso" text="ইয়াকো চাওক %t."/>
|
||||
<l:template name="seealso-separator" text=", "/>
|
||||
</l:context>
|
||||
<l:context name="msgset"><l:template name="MsgAud" text="শ্ৰোতা: "/>
|
||||
<l:template name="MsgLevel" text="স্তৰ: "/>
|
||||
<l:template name="MsgOrig" text="উৎস: "/>
|
||||
</l:context>
|
||||
<l:context name="datetime"><l:template name="format" text="m/d/Y"/>
|
||||
</l:context>
|
||||
<l:context name="termdef"><l:template name="prefix" text="[Definition: "/>
|
||||
<l:template name="suffix" text="]"/>
|
||||
</l:context>
|
||||
<l:context name="datetime-full"><l:template name="January" text="জানুৱাৰী"/>
|
||||
<l:template name="February" text="ফেব্ৰুৱাৰী"/>
|
||||
<l:template name="March" text="মাৰ্চ"/>
|
||||
<l:template name="April" text="এপ্ৰিল"/>
|
||||
<l:template name="May" text="মে'"/>
|
||||
<l:template name="June" text="জুন"/>
|
||||
<l:template name="July" text="জুলাই"/>
|
||||
<l:template name="August" text="আগষ্ট"/>
|
||||
<l:template name="September" text="চেপ্টেম্বৰ"/>
|
||||
<l:template name="October" text="অক্টোবৰ"/>
|
||||
<l:template name="November" text="নৱেম্বৰ"/>
|
||||
<l:template name="December" text="ডিচেম্বৰ"/>
|
||||
<l:template name="Monday" text="সোমবাৰ"/>
|
||||
<l:template name="Tuesday" text="মঙ্গলবাৰ"/>
|
||||
<l:template name="Wednesday" text="বুধবাৰ"/>
|
||||
<l:template name="Thursday" text="বৃহস্পতিবাৰ"/>
|
||||
<l:template name="Friday" text="শুকুৰবাৰ"/>
|
||||
<l:template name="Saturday" text="শনিবাৰ"/>
|
||||
<l:template name="Sunday" text="দেওবাৰ"/>
|
||||
</l:context>
|
||||
<l:context name="datetime-abbrev"><l:template name="Jan" text="জানুৱাৰী"/>
|
||||
<l:template name="Feb" text="ফেব্ৰুৱাৰী"/>
|
||||
<l:template name="Mar" text="মাৰ্চ"/>
|
||||
<l:template name="Apr" text="এপ্ৰিল"/>
|
||||
<l:template name="May" text="মে'"/>
|
||||
<l:template name="Jun" text="জুন"/>
|
||||
<l:template name="Jul" text="জুলাই"/>
|
||||
<l:template name="Aug" text="আগষ্ট"/>
|
||||
<l:template name="Sep" text="চেপ্টেম্বৰ"/>
|
||||
<l:template name="Oct" text="অক্টোবৰ"/>
|
||||
<l:template name="Nov" text="নৱেম্বৰ"/>
|
||||
<l:template name="Dec" text="ডিচেম্বৰ"/>
|
||||
<l:template name="Mon" text="সোম"/>
|
||||
<l:template name="Tue" text="মঙ্গল"/>
|
||||
<l:template name="Wed" text="বুধ"/>
|
||||
<l:template name="Thu" text="বৃহস্পতি"/>
|
||||
<l:template name="Fri" text="শুকুৰ"/>
|
||||
<l:template name="Sat" text="শনি"/>
|
||||
<l:template name="Sun" text="দেও"/>
|
||||
</l:context>
|
||||
<l:context name="htmlhelp"><l:template name="langcode" text="0x044d Assamese"/>
|
||||
</l:context>
|
||||
<l:context name="index"><l:template name="term-separator" text=", "/>
|
||||
<l:template name="number-separator" text=", "/>
|
||||
<l:template name="range-separator" text="-"/>
|
||||
</l:context>
|
||||
<l:context name="iso690"><l:template name="lastfirst.sep" text=", "/>
|
||||
<l:template name="alt.person.two.sep" text=" – "/>
|
||||
<l:template name="alt.person.last.sep" text=" – "/>
|
||||
<l:template name="alt.person.more.sep" text=" – "/>
|
||||
<l:template name="primary.editor" text=" (ed.)"/>
|
||||
<l:template name="primary.many" text=", et al."/>
|
||||
<l:template name="primary.sep" text=". "/>
|
||||
<l:template name="submaintitle.sep" text=": "/>
|
||||
<l:template name="title.sep" text=". "/>
|
||||
<l:template name="othertitle.sep" text=", "/>
|
||||
<l:template name="medium1" text=" ["/>
|
||||
<l:template name="medium2" text="]"/>
|
||||
<l:template name="secondary.person.sep" text="; "/>
|
||||
<l:template name="secondary.sep" text=". "/>
|
||||
<l:template name="respons.sep" text=". "/>
|
||||
<l:template name="edition.sep" text=". "/>
|
||||
<l:template name="edition.serial.sep" text=", "/>
|
||||
<l:template name="issuing.range" text="-"/>
|
||||
<l:template name="issuing.div" text=", "/>
|
||||
<l:template name="issuing.sep" text=". "/>
|
||||
<l:template name="partnr.sep" text=". "/>
|
||||
<l:template name="placepubl.sep" text=": "/>
|
||||
<l:template name="publyear.sep" text=", "/>
|
||||
<l:template name="pubinfo.sep" text=". "/>
|
||||
<l:template name="spec.pubinfo.sep" text=", "/>
|
||||
<l:template name="upd.sep" text=", "/>
|
||||
<l:template name="datecit1" text=" [cited "/>
|
||||
<l:template name="datecit2" text="]"/>
|
||||
<l:template name="extent.sep" text=". "/>
|
||||
<l:template name="locs.sep" text=", "/>
|
||||
<l:template name="location.sep" text=". "/>
|
||||
<l:template name="serie.sep" text=". "/>
|
||||
<l:template name="notice.sep" text=". "/>
|
||||
<l:template name="access" text="Available "/>
|
||||
<l:template name="acctoo" text="Also available "/>
|
||||
<l:template name="onwww" text="from World Wide Web"/>
|
||||
<l:template name="oninet" text="from Internet"/>
|
||||
<l:template name="access.end" text=": "/>
|
||||
<l:template name="link1" text="<"/>
|
||||
<l:template name="link2" text=">"/>
|
||||
<l:template name="access.sep" text=". "/>
|
||||
<l:template name="isbn" text="ISBN "/>
|
||||
<l:template name="issn" text="ISSN "/>
|
||||
<l:template name="stdnum.sep" text=". "/>
|
||||
<l:template name="patcountry.sep" text=". "/>
|
||||
<l:template name="pattype.sep" text=", "/>
|
||||
<l:template name="patnum.sep" text=". "/>
|
||||
<l:template name="patdate.sep" text=". "/>
|
||||
</l:context><l:letters><l:l i="-1"/>
|
||||
<l:l i="0">চিহ্ন</l:l>
|
||||
<l:l i="10">A</l:l>
|
||||
<l:l i="10">a</l:l>
|
||||
<l:l i="20">B</l:l>
|
||||
<l:l i="20">b</l:l>
|
||||
<l:l i="30">C</l:l>
|
||||
<l:l i="30">c</l:l>
|
||||
<l:l i="40">D</l:l>
|
||||
<l:l i="40">d</l:l>
|
||||
<l:l i="50">E</l:l>
|
||||
<l:l i="50">e</l:l>
|
||||
<l:l i="60">F</l:l>
|
||||
<l:l i="60">f</l:l>
|
||||
<l:l i="70">G</l:l>
|
||||
<l:l i="70">g</l:l>
|
||||
<l:l i="80">H</l:l>
|
||||
<l:l i="80">h</l:l>
|
||||
<l:l i="90">I</l:l>
|
||||
<l:l i="90">i</l:l>
|
||||
<l:l i="100">J</l:l>
|
||||
<l:l i="100">j</l:l>
|
||||
<l:l i="110">K</l:l>
|
||||
<l:l i="110">k</l:l>
|
||||
<l:l i="120">L</l:l>
|
||||
<l:l i="120">l</l:l>
|
||||
<l:l i="130">M</l:l>
|
||||
<l:l i="130">m</l:l>
|
||||
<l:l i="140">N</l:l>
|
||||
<l:l i="140">n</l:l>
|
||||
<l:l i="150">O</l:l>
|
||||
<l:l i="150">o</l:l>
|
||||
<l:l i="160">P</l:l>
|
||||
<l:l i="160">p</l:l>
|
||||
<l:l i="170">Q</l:l>
|
||||
<l:l i="170">q</l:l>
|
||||
<l:l i="180">R</l:l>
|
||||
<l:l i="180">r</l:l>
|
||||
<l:l i="190">S</l:l>
|
||||
<l:l i="190">s</l:l>
|
||||
<l:l i="200">T</l:l>
|
||||
<l:l i="200">t</l:l>
|
||||
<l:l i="210">U</l:l>
|
||||
<l:l i="210">u</l:l>
|
||||
<l:l i="220">V</l:l>
|
||||
<l:l i="220">v</l:l>
|
||||
<l:l i="230">W</l:l>
|
||||
<l:l i="230">w</l:l>
|
||||
<l:l i="240">X</l:l>
|
||||
<l:l i="240">x</l:l>
|
||||
<l:l i="250">Y</l:l>
|
||||
<l:l i="250">y</l:l>
|
||||
<l:l i="260">Z</l:l>
|
||||
<l:l i="260">z</l:l>
|
||||
</l:letters>
|
||||
</l:l10n>
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue