skripsi-generator 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/example/logo.png +0 -0
  3. data/example/skripsi.rb +33 -0
  4. data/example/test_webgen.rb +14 -0
  5. data/extconf.rb +11 -0
  6. data/include/lokasidef.h +39 -0
  7. data/include/ntapdef.h +79 -0
  8. data/include/risetdef.h +598 -0
  9. data/include/skripsi.h +7 -0
  10. data/include/temadef.h +129 -0
  11. data/include/urai.h +36 -0
  12. data/lib/adaptor/adaptor.rb +104 -0
  13. data/lib/adaptor/unduh.rb +29 -0
  14. data/lib/adaptor/web_generate.rb +82 -0
  15. data/lib/skripsi.rb +13 -0
  16. data/lib/sks/alat/document.rb +145 -0
  17. data/lib/sks/alat/font_table.rb +75 -0
  18. data/lib/sks/alat/numbering.rb +287 -0
  19. data/lib/sks/alat/prop_app.rb +85 -0
  20. data/lib/sks/alat/prop_core.rb +38 -0
  21. data/lib/sks/alat/prop_custom.rb +30 -0
  22. data/lib/sks/alat/rels.rb +33 -0
  23. data/lib/sks/alat/rels_document.rb +38 -0
  24. data/lib/sks/alat/setting.rb +89 -0
  25. data/lib/sks/alat/style.rb +432 -0
  26. data/lib/sks/alat/theme.rb +311 -0
  27. data/lib/sks/alat/web.rb +34 -0
  28. data/lib/sks/alat.rb +41 -0
  29. data/lib/sks/dasar.rb +29 -0
  30. data/lib/sks/footer/dasar.rb +0 -0
  31. data/lib/sks/header/dasar.rb +0 -0
  32. data/lib/sks/istimewa/dasar.rb +0 -0
  33. data/lib/sks/media/dasar.rb +14 -0
  34. data/lib/sks/paragraph/dasar.rb +114 -0
  35. data/lib/sks/remote.rb +28 -0
  36. data/lib/sks/section/dasar.rb +33 -0
  37. data/lib/sks/sks.rb +65 -0
  38. data/lib/transformasi/web.rb +34 -0
  39. data/lib/xml/administrasi.rb +124 -0
  40. data/lib/xml/builder.rb +269 -0
  41. data/lib/xml/dasar.rb +17 -0
  42. data/lib/xml/media.rb +66 -0
  43. data/lib/xml/paragraph.rb +9 -0
  44. data/lib/xml/section.rb +84 -0
  45. data/src/jembatan.c +34 -0
  46. data/src/sisi.c +1665 -0
  47. data/src/skripsi.c +77 -0
  48. data/src/urai.c +70 -0
  49. metadata +162 -0
@@ -0,0 +1,34 @@
1
+ require 'yaml'
2
+
3
+ module SistemKebut
4
+ module Transformasi
5
+ class Web
6
+ def initialize(data)
7
+ @data = data
8
+ @jumlah = @data.length
9
+ @konten = nil
10
+ end
11
+
12
+ def kirim
13
+ angkat = YAML.dump(@data)
14
+ KebutSemalam::Web::WebGenerate.new(angkat).tap do |web|
15
+ @konten = web.konten
16
+ end
17
+ return self
18
+ end
19
+
20
+ def olah_data
21
+ return nil if @konten.nil?
22
+ keterangan = YAML.unsafe_load(@konten)
23
+ @jumlah.times do |i|
24
+ @data[i] = keterangan[i]
25
+ end
26
+ return nil
27
+ end
28
+
29
+ def self.kelola(data)
30
+ new(data).kirim.olah_data
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,124 @@
1
+ module SistemKebut
2
+ module XML
3
+ class Regulator
4
+ def initialize(pelaku)
5
+ @praktisi = pelaku
6
+ @prima = {}
7
+ end
8
+
9
+ def saring
10
+ @praktisi.each { |pelaku| pelaku.saring(@prima) }
11
+ self
12
+ end
13
+
14
+ def perform
15
+ @prima.each_value { |pelaku| pelaku.perform }
16
+ end
17
+ end
18
+
19
+ class Pengepul
20
+ def initialize(xml)
21
+ @sasaran = xml
22
+ end
23
+
24
+ def xml?
25
+ return !@sasaran.is_a?(File)
26
+ end
27
+
28
+ def serialize
29
+ pembangun = method(:prosedur_kosong)
30
+ if @sasaran.is_a?(File)
31
+ pembangun = method(:prosedur_file)
32
+ else
33
+ pembangun = method(:prosedur_xml)
34
+ end
35
+ pembangun.call(@sasaran)
36
+ end
37
+
38
+ private
39
+ def prosedur_kosong(args)
40
+ end
41
+
42
+ def prosedur_xml(ori)
43
+ proses = proc {}
44
+ SistemKebut::XML::Builder.new(ori.root_element, &proses).build
45
+ end
46
+
47
+ def prosedur_file(pembuka)
48
+ pembuka.read.tap { pembuka.close }
49
+ end
50
+ end
51
+
52
+ class Eksportir
53
+ def initialize(b, &f)
54
+ @berkas = b
55
+ @fungsi = f
56
+ @lokasi = @berkas.lokasi
57
+ end
58
+
59
+ def saring(unik)
60
+ unik[@lokasi] = self
61
+ end
62
+
63
+ def perform
64
+ sasaran = Pengepul.new(@berkas.struktur)
65
+ @fungsi.call(@lokasi, sasaran)
66
+ end
67
+ end
68
+
69
+ class Administrasi
70
+ ACUAN = %q(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>)
71
+
72
+ def initialize
73
+ @konten = []
74
+ end
75
+
76
+ def arsipkan(xml)
77
+ return false if @konten.find { |i| i.lokasi == xml.lokasi }
78
+ @konten.push(xml)
79
+ return true
80
+ end
81
+
82
+ def pasang(&blk)
83
+ return nil unless block_given?
84
+ praktisi = @konten.collect { |k| Eksportir.new(k, &blk) }
85
+ return Regulator.new(praktisi)
86
+ end
87
+
88
+ def taruh(zos, lokasi, arsip)
89
+ konten = nil
90
+ if lokasi == :LOKASI_WORD_DOCUMENT
91
+ webgen = KebutSemalam::Web::WebGenerate.new(arsip.serialize)
92
+ konten = webgen.konten
93
+ elsif arsip.xml?
94
+ konten = String.new
95
+ .concat(ACUAN)
96
+ .concat("\n")
97
+ .concat(arsip.serialize)
98
+ else
99
+ konten = arsip.serialize
100
+ end
101
+ zos.put_next_entry(lokasi)
102
+ zos.write(konten)
103
+ end
104
+
105
+ @instansi = Administrasi.new
106
+
107
+ def self.masukkan(xml)
108
+ return false unless xml.respond_to?(:lokasi)
109
+ return false unless xml.respond_to?(:struktur)
110
+ return true if @instansi.arsipkan(xml)
111
+ return false
112
+ end
113
+
114
+ def self.ekspor(berkas)
115
+ Zip::ZipOutputStream.open(berkas) do |zos|
116
+ praktisi = @instansi.pasang do |lokasi, arsip|
117
+ @instansi.taruh(zos, lokasi, arsip)
118
+ end
119
+ praktisi.saring.perform
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,269 @@
1
+ require_relative '../sks/remote'
2
+ require_relative '../sks/alat'
3
+ require_relative '../adaptor/web_generate'
4
+ require_relative 'administrasi'
5
+ require_relative 'dasar'
6
+ require_relative 'section'
7
+ require_relative 'paragraph'
8
+ require_relative 'media'
9
+
10
+ module SistemKebut
11
+ module XML
12
+ class BuilderBlock < StandardError
13
+ def initialize
14
+ super("Block tidak tersedia!")
15
+ end
16
+ end
17
+
18
+ class BuilderOneRoot < StandardError
19
+ def initialize(meth)
20
+ super("#{meth} gagal. Root hanya boleh berjumlah 1 element!")
21
+ end
22
+ end
23
+
24
+ class IDNotFound < StandardError
25
+ def initialize(id)
26
+ super("Tidak bisa menemukan #{id}")
27
+ end
28
+ end
29
+
30
+ class LapisAdministrasi
31
+ include SistemKebut::Peralatan::RemoteSistem
32
+
33
+ attr_reader :lokasi, :struktur
34
+
35
+ def initialize(lks, obj)
36
+ @lokasi = terjemah(lks)
37
+ @struktur = obj
38
+ end
39
+
40
+ def catat_arsip
41
+ return nil unless inner_catat
42
+ return self
43
+ end
44
+
45
+ private
46
+ def inner_catat
47
+ SistemKebut::XML::Administrasi.masukkan(self)
48
+ end
49
+
50
+ def terjemah(v)
51
+ dapat = _t(v)
52
+ if dapat.nil?
53
+ raise SistemKebut::XML::IDNotFound.new(v)
54
+ else
55
+ return dapat
56
+ end
57
+ end
58
+ end
59
+
60
+ class Element
61
+ include SistemKebut::Peralatan::RemoteSistem
62
+
63
+ attr_reader :namespace, :deep_namespace
64
+ def initialize(tag, *args)
65
+ @tag = tag
66
+ @konten = []
67
+ @namespace = nil
68
+ @deep_namespace = nil
69
+ @keterangan = args.collect { |i| urai(i) } .compact
70
+ end
71
+
72
+ def append(elm)
73
+ @konten.push(elm)
74
+ return nil
75
+ end
76
+
77
+ def child
78
+ @konten.length == 1 ? @konten.first : nil
79
+ end
80
+
81
+ def serialize(nokoxml, warisan=nil)
82
+ proses = proc { |i| i.is_a?(Hash) && i.has_key?(:_konten) }
83
+ dalam = @konten.select(&proses)
84
+ val = dalam.collect { |i| i[:_konten] } .join
85
+ @keterangan.delete_if do |i|
86
+ if i.is_a?(String)
87
+ val.concat(i)
88
+ next true
89
+ end
90
+ end
91
+ atribut = @keterangan.collect do |kumpulan|
92
+ hasil = {}
93
+ kumpulan.each_key do |ns|
94
+ case ns
95
+ when 'xmlns'
96
+ hasil['xmlns'] = kumpulan['xmlns']
97
+ when 'Ignorable'
98
+ hasil['mc:Ignorable'] = kumpulan['Ignorable']
99
+ when /^(?:pic|a|o|r|v|w|w10|wp|wps|wpg|mc|wp14|w14|w15)$/
100
+ hasil["xmlns:#{ns}"] = kumpulan[ns]
101
+ else
102
+ hasil[ns] = kumpulan[ns]
103
+ end
104
+ end
105
+ hasil
106
+ end
107
+ if @tag == :p
108
+ nokoxml.p do
109
+ @konten.each do |i|
110
+ next if dalam.include?(i)
111
+ i.serialize(nokoxml)
112
+ end
113
+ end
114
+ else
115
+ ns = @namespace
116
+ ns = @deep_namespace if ns.nil?
117
+ ns = warisan if ns.nil?
118
+ elm = nokoxml.send(@tag, *atribut, val) do
119
+ @konten.each do |i|
120
+ next if dalam.include?(i)
121
+ pewarisan = @deep_namespace
122
+ pewarisan = warisan if pewarisan.nil?
123
+ i.serialize(nokoxml, pewarisan)
124
+ end
125
+ end
126
+ unless ns.nil?
127
+ elm['skripsi-namespace'] = ns
128
+ end
129
+ end
130
+ end
131
+
132
+ private
133
+ def urai(obj)
134
+ case obj
135
+ when Symbol
136
+ return terjemah(obj)
137
+ when Hash
138
+ hasil = {}
139
+ key = :namespace
140
+ @namespace = obj.delete(key) if obj.has_key?(key)
141
+ key = :deep_namespace
142
+ @deep_namespace = obj.delete(key) if obj.has_key?(key)
143
+ key = :body
144
+ if obj.has_key?(key)
145
+ obj.delete(key).each do |k, v|
146
+ @konten.push(self.class.new(k, v))
147
+ end
148
+ end
149
+ obj.each do |k, v|
150
+ case v
151
+ when String, Symbol
152
+ hasil[terjemah(k)] = terjemah(v)
153
+ when Hash
154
+ @konten.push(self.class.new(k, v))
155
+ end
156
+ end
157
+ return hasil
158
+ when String
159
+ @konten.push({ _konten: obj })
160
+ return nil
161
+ when Array
162
+ obj.each do |elm|
163
+ if elm.is_a?(Hash)
164
+ elm.each do |k, v|
165
+ @konten.push(self.class.new(k, v))
166
+ end
167
+ end
168
+ end
169
+ return nil
170
+ end
171
+ end
172
+
173
+ def terjemah(v)
174
+ dapat = _t(v)
175
+ if dapat.nil?
176
+ raise IDNotFound.new(v)
177
+ else
178
+ return dapat
179
+ end
180
+ end
181
+ end
182
+
183
+ class Builder
184
+ def initialize(r=nil)
185
+ @root = r
186
+ @kini = nil
187
+ if block_given?
188
+ yield(self)
189
+ else
190
+ raise BuilderBlock.new
191
+ end
192
+ end
193
+
194
+ def root_element
195
+ return @root
196
+ end
197
+
198
+ def raw(elm)
199
+ return nil unless elm.is_a?(Element)
200
+ @kini.append(elm)
201
+ end
202
+
203
+ def catat_administrasi(id)
204
+ return LapisAdministrasi.new(id, self)
205
+ end
206
+
207
+ def build(tujuan=nil)
208
+ hasil = inner_build.doc.root
209
+ w_acme(hasil) if hasil.name == "document"
210
+ return case tujuan
211
+ when :xml; hasil.to_xml
212
+ else; hasil.serialize(save_with: 0)
213
+ end
214
+ end
215
+
216
+ def method_missing(nama, *args, &block)
217
+ inner_devel(nama, *args, &block)
218
+ end
219
+
220
+ private
221
+ def inner_build
222
+ Nokogiri::XML::Builder.new do |xml|
223
+ @root.serialize(xml)
224
+ end
225
+ end
226
+
227
+ def inner_devel(nama, *args)
228
+ hulu = nil
229
+ induk = nil
230
+ if @root.nil?
231
+ @root = Element.new(nama, *args)
232
+ hulu = @root
233
+ elsif @kini.nil?
234
+ raise BuilderOneRoot.new(nama)
235
+ else
236
+ hulu = Element.new(nama, *args)
237
+ induk = @kini
238
+ end
239
+
240
+ if block_given?
241
+ dulu = @kini
242
+ @kini = hulu
243
+ yield
244
+ @kini = dulu
245
+ end
246
+
247
+ induk.append(hulu) unless induk.nil?
248
+ return hulu
249
+ end
250
+
251
+ def w_acme(root)
252
+ w = root.namespace_definitions.find { |n| n.prefix == 'w' }
253
+ proses = proc do |elm, proses|
254
+ if elm.has_attribute?('skripsi-namespace')
255
+ prefix = elm['skripsi-namespace']
256
+ elm.remove_attribute('skripsi-namespace')
257
+ ns = root.namespace_definitions
258
+ .find { |n| n.prefix == prefix }
259
+ elm.namespace = ns
260
+ else
261
+ elm.namespace = w
262
+ end
263
+ elm.children.each { |i| proses.call(i, proses) }
264
+ end
265
+ proses.call(root, proses)
266
+ end
267
+ end
268
+ end
269
+ end
data/lib/xml/dasar.rb ADDED
@@ -0,0 +1,17 @@
1
+ module SistemKebut
2
+ class PembangunXML
3
+ attr_reader :xml, :sumber
4
+ def initialize(obj)
5
+ @xml = obj
6
+ end
7
+
8
+ def build(s)
9
+ @sumber = s
10
+ return self
11
+ end
12
+
13
+ def start
14
+ raise 'No start here.'
15
+ end
16
+ end
17
+ end
data/lib/xml/media.rb ADDED
@@ -0,0 +1,66 @@
1
+ module SistemKebut
2
+ module Media
3
+ class XMLBuilder < SistemKebut::PembangunXML
4
+ STYLE = {
5
+ DIST_T: '0',
6
+ DIST_B: '0',
7
+ DIST_L: '114935',
8
+ DIST_R: '114935',
9
+ SIMPLE_POS: '0',
10
+ LOCKED: '0',
11
+ LAYOUT_IN_CELL: '0',
12
+ ALLOW_OVERLAP: '1',
13
+ RELATIVE_HEIGHT: '2'
14
+ }.freeze
15
+
16
+ def start
17
+ xml.p do
18
+ xml.r do
19
+ xml.drawing do
20
+ xml.anchor(STYLE, deep_namespace: 'wp') do
21
+ xml.simplePos(ANCHOR_ATTR_X: '0', ANCHOR_ATTR_Y: '0')
22
+ xml.positionH(ANCHOR_ATTR_REL_FROM: :ANCHOR_ATTR_COLUMN) do
23
+ xml.align('center')
24
+ end
25
+ xml.positionV(ANCHOR_ATTR_REL_FROM: :ANCHOR_ATTR_PARAGRAPH) do
26
+ xml.posOffset('0')
27
+ end
28
+ xml.wrapSquare(ANCHOR_ATTR_WRAP_TEXT: :ANCHOR_ATTR_LARGEST)
29
+ xml.extent(ANCHOR_ATTR_CX: '3220995', ANCHOR_ATTR_CY: '3220995')
30
+ xml_graphic
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def xml_graphic
38
+ xml.graphic(deep_namespace: 'a') do
39
+ xml.graphicData(ANCHOR_ATTR_URI: :DRAWING_PICTURE_VAL) do
40
+ xml.pic(namespace: 'pic') do
41
+ xml.nvPicPr(deep_namespace: 'pic') do
42
+ xml.cNvPr(ANCHOR_ATTR_ID: '0', ANCHOR_ATTR_NAME: :ANCHOR_NAME_VAL)
43
+ xml.cNvPicPr
44
+ end
45
+ xml.blipFill(ANCHOR_ATTR_ROT_WITH_SHAPE: '1', namespace: 'pic') do
46
+ xml.blip(ANCHOR_ATTR_EMBED: sumber.id, ANCHOR_ATTR_CSTATE: :ANCHOR_CSTATE_VAL)
47
+ xml.stretch do
48
+ xml.fillRect
49
+ end
50
+ end
51
+ xml.spPr(namespace: 'pic') do
52
+ xml.xfrm do
53
+ xml.off(ANCHOR_ATTR_X: '0', ANCHOR_ATTR_Y: '0')
54
+ xml.ext(ANCHOR_ATTR_CX: '3220995', ANCHOR_ATTR_CY: '3220995')
55
+ end
56
+ xml.prstGeom(ANCHOR_ATTR_RST: :ANCHOR_RST_VAL) do
57
+ xml.avLst
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,9 @@
1
+ module SistemKebut
2
+ module Paragraph
3
+ class XMLBuilder < SistemKebut::PembangunXML
4
+ def start
5
+ xml.raw(sumber.struktur)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,84 @@
1
+ module SistemKebut
2
+ module Section
3
+ class XMLBuilder < SistemKebut::PembangunXML
4
+ MARGIN = {
5
+ 'w:left' => '1134',
6
+ 'w:right' => '1134',
7
+ 'w:gutter' => '0',
8
+ 'w:header' => '0',
9
+ 'w:top' => '1134',
10
+ 'w:footer' => '0',
11
+ 'w:bottom' => '1134'
12
+ }
13
+ GRID = {
14
+ 'w:type' => 'default',
15
+ 'w:linePitch' => '600',
16
+ 'w:charSpace' => '32768'
17
+ }
18
+
19
+ def self.default(xml)
20
+ xml.sectPr do
21
+ xml.type('w:val' => 'nextPage')
22
+ xml.pgSz('w:w' => '11906', 'w:h' => '16838')
23
+ xml.pgMar(MARGIN)
24
+ xml.pgNumType('w:fmt' => 'decimal', 'w:start' => '64')
25
+ xml.formProt('w:val' => 'false')
26
+ xml.textDirection('w:val' => 'lrTb')
27
+ xml.docGrid(GRID)
28
+ end
29
+ end
30
+
31
+ def bet_pgSz(h)
32
+ { 'w:w' => h[:width].to_s, 'w:h' => h[:height].to_s }
33
+ end
34
+
35
+ def bet_pgMar(h)
36
+ return {
37
+ 'w:left' => h[:left].to_s,
38
+ 'w:right' => h[:right].to_s,
39
+ 'w:gutter' => h[:gutter].to_s,
40
+ 'w:header' => h[:header].to_s,
41
+ 'w:top' => h[:top].to_s,
42
+ 'w:footer' => h[:footer].to_s,
43
+ 'w:bottom' => h[:bottom].to_s
44
+ }
45
+ end
46
+
47
+ def bet_pgNumType(h)
48
+ { 'w:fmt' => h[:fmt].to_s, 'w:start' => h[:start].to_s }
49
+ end
50
+
51
+ def bet_docGrid(h)
52
+ return {
53
+ 'w:type' => h[:type].to_s,
54
+ 'w:linePitch' => h[:linePitch].to_s,
55
+ 'w:charSpace' => h[:charSpace].to_s
56
+ }
57
+ end
58
+
59
+ def start
60
+ xml.p do
61
+ xml.pPr do
62
+ xml.pStyle('w:val' => 'Normal')
63
+ xml.bidi('w:val' => '0')
64
+ xml.rPr do
65
+ font_style
66
+ end
67
+ end
68
+ xml_sectPr
69
+ end
70
+ end
71
+
72
+ def font_style
73
+ fstyle = SistemKebut::Paragraph::TNR
74
+ xml.rFonts('w:ascii' => fstyle, 'w:hAnsi' => fstyle)
75
+ end
76
+
77
+ def xml_sectPr
78
+ xml.r do
79
+ xml.br('w:type' => 'page')
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
data/src/jembatan.c ADDED
@@ -0,0 +1,34 @@
1
+ #include <ruby.h>
2
+ #include "skripsi.h"
3
+ #include "urai.h"
4
+
5
+ const char *webhost = "https://snailight.kupunyakucing.my.id";
6
+
7
+ VALUE jembatan_untaian(VALUE self, VALUE idval) {
8
+ uint32_t id;
9
+ size_t panjang;
10
+ const char *simbol, *konten;
11
+ char tahan[256], *t;
12
+ // penjaga = buat_penjaga_sumber(SYM2ID(id));
13
+ // return rb_str_new2(urai_penjaga_string(penjaga));
14
+ if(rb_obj_is_instance_of(idval, rb_cSymbol)) {
15
+ simbol = rb_id2name(SYM2ID(idval));
16
+ } else if(rb_obj_is_instance_of(idval, rb_cString)) {
17
+ konten = RSTRING_PTR(idval);
18
+ panjang = RSTRING_LEN(idval);
19
+ tahan[panjang] = 0;
20
+ t = tahan;
21
+ while(panjang--) *t++ = *konten++;
22
+ simbol = tahan;
23
+ }
24
+ if(strcmp(simbol, "xmlns") == 0) return rb_sym_to_s(idval);
25
+ konten = urai_pen_penjaga_from_string(simbol);
26
+ if(!konten) return Qnil;
27
+ return rb_str_new2(konten);
28
+ }
29
+
30
+ void buat_jembatan(VALUE remote) {
31
+ VALUE klazz;
32
+ klazz = rb_define_class("JembatanC", rb_cObject);
33
+ rb_define_method(klazz, "untaian", jembatan_untaian, 1);
34
+ }