blacklight_iiif_search 1.0.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Rakefile +3 -1
- data/app/controllers/concerns/blacklight_iiif_search/controller.rb +7 -3
- data/app/models/blacklight_iiif_search/iiif_search.rb +2 -0
- data/app/models/blacklight_iiif_search/iiif_search_annotation.rb +4 -0
- data/app/models/blacklight_iiif_search/iiif_search_response.rb +2 -0
- data/app/models/blacklight_iiif_search/iiif_suggest_response.rb +2 -0
- data/app/models/blacklight_iiif_search/iiif_suggest_search.rb +4 -0
- data/app/models/concerns/blacklight_iiif_search/annotation_behavior.rb +2 -0
- data/app/models/concerns/blacklight_iiif_search/ignored.rb +2 -0
- data/app/models/concerns/blacklight_iiif_search/search_behavior.rb +2 -0
- data/lib/blacklight_iiif_search.rb +2 -0
- data/lib/blacklight_iiif_search/engine.rb +2 -0
- data/lib/blacklight_iiif_search/routes.rb +2 -0
- data/lib/blacklight_iiif_search/version.rb +3 -1
- data/lib/generators/blacklight_iiif_search/controller_generator.rb +4 -2
- data/lib/generators/blacklight_iiif_search/install_generator.rb +3 -2
- data/lib/generators/blacklight_iiif_search/model_generator.rb +2 -0
- data/lib/generators/blacklight_iiif_search/routes_generator.rb +12 -10
- data/lib/generators/blacklight_iiif_search/solr_generator.rb +24 -22
- data/lib/generators/blacklight_iiif_search/templates/iiif_search_builder.rb +2 -0
- data/lib/railties/blacklight_iiif_search.rake +2 -0
- data/spec/controllers/catalog_controller_spec.rb +13 -11
- data/spec/fixtures/sample_solr_documents.yml +116 -116
- data/spec/iiif_search_shared.rb +4 -2
- data/spec/models/blacklight_iiif_search/iiif_search_annotation_spec.rb +10 -8
- data/spec/models/blacklight_iiif_search/iiif_search_response_spec.rb +23 -19
- data/spec/models/blacklight_iiif_search/iiif_search_spec.rb +2 -0
- data/spec/models/blacklight_iiif_search/iiif_suggest_response_spec.rb +14 -12
- data/spec/models/blacklight_iiif_search/iiif_suggest_search_spec.rb +8 -6
- data/spec/models/concerns/blacklight_iiif_search/annotation_behavior_spec.rb +5 -6
- data/spec/models/concerns/blacklight_iiif_search/ignored_spec.rb +2 -0
- data/spec/models/concerns/blacklight_iiif_search/search_behavior_spec.rb +5 -3
- data/spec/spec_helper.rb +2 -0
- data/spec/test_app_templates/lib/generators/test_app_generator.rb +2 -0
- metadata +16 -44
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4358a1b34fd697ba1970f5f01026283f406abbc8a3e6e6da9bbac1d9366db87a
|
4
|
+
data.tar.gz: b52ca7666a8fbe3e374a55d4e553f53a31ec9eca46d864d85c553d0b22936092
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f47bf0ea3f7b869a1d279d8e17129a0a7dffa967781842a63526eb6d61bd37343d151be2a0fc80eca3461300efa7dca77dcaf2dc582748008eff5f9f7700901
|
7
|
+
data.tar.gz: 9db3d2c71682e95d8a31b10340de5c70d47302346b666f01cda4301afb447d57469069e12d84d30732e64813c0cfb81b7194b182bf461050c97de1f26cfa448c
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
begin
|
2
4
|
require 'bundler/setup'
|
3
5
|
rescue LoadError
|
@@ -32,7 +34,7 @@ require 'rubocop/rake_task'
|
|
32
34
|
RuboCop::RakeTask.new(:rubocop)
|
33
35
|
|
34
36
|
desc 'Run test suite'
|
35
|
-
task ci: ['engine_cart:generate'] do
|
37
|
+
task ci: [:rubocop, 'engine_cart:generate'] do
|
36
38
|
SolrWrapper.wrap do |solr|
|
37
39
|
FileUtils.cp File.join(__dir__, 'lib', 'generators', 'blacklight_iiif_search', 'templates', 'solr', 'lib', 'tokenizing-suggest-v1.0.1.jar'),
|
38
40
|
File.join(solr.instance_dir, 'contrib')
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# return a IIIF Content Search response
|
2
4
|
module BlacklightIiifSearch
|
3
5
|
module Controller
|
@@ -9,10 +11,12 @@ module BlacklightIiifSearch
|
|
9
11
|
end
|
10
12
|
|
11
13
|
def iiif_search
|
12
|
-
_parent_response, @parent_document = fetch(params[:solr_document_id])
|
14
|
+
_parent_response, @parent_document = search_service.fetch(params[:solr_document_id])
|
13
15
|
iiif_search = IiifSearch.new(iiif_search_params, iiif_search_config,
|
14
16
|
@parent_document)
|
15
|
-
|
17
|
+
iiif_search_service = search_service_class.new(config: blacklight_config,
|
18
|
+
user_params: iiif_search.solr_params)
|
19
|
+
@response, _document_list = iiif_search_service.search_results
|
16
20
|
iiif_search_response = IiifSearchResponse.new(@response,
|
17
21
|
@parent_document,
|
18
22
|
self)
|
@@ -21,7 +25,7 @@ module BlacklightIiifSearch
|
|
21
25
|
end
|
22
26
|
|
23
27
|
def iiif_suggest
|
24
|
-
suggest_search = IiifSuggestSearch.new(params,
|
28
|
+
suggest_search = IiifSuggestSearch.new(params, Blacklight.default_index, self)
|
25
29
|
render json: suggest_search.response,
|
26
30
|
content_type: 'application/json'
|
27
31
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# corresponds to IIIF Annotation resource
|
2
4
|
module BlacklightIiifSearch
|
3
5
|
class IiifSearchAnnotation
|
@@ -14,6 +16,7 @@ module BlacklightIiifSearch
|
|
14
16
|
# @param [String] snippet
|
15
17
|
# @param [CatalogController] controller
|
16
18
|
# @param [SolrDocument] parent_document
|
19
|
+
# rubocop:disable Metrics/ParameterLists
|
17
20
|
def initialize(document, query, hl_index, snippet, controller, parent_document)
|
18
21
|
@document = document
|
19
22
|
@query = query
|
@@ -22,6 +25,7 @@ module BlacklightIiifSearch
|
|
22
25
|
@controller = controller
|
23
26
|
@parent_document = parent_document
|
24
27
|
end
|
28
|
+
# rubocop:enable Metrics/ParameterLists
|
25
29
|
|
26
30
|
##
|
27
31
|
# @return [IIIF::Presentation::Annotation]
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# IiifSuggestSearch
|
2
4
|
module BlacklightIiifSearch
|
3
5
|
class IiifSuggestSearch
|
@@ -28,10 +30,12 @@ module BlacklightIiifSearch
|
|
28
30
|
##
|
29
31
|
# Query the suggest handler
|
30
32
|
# @return [RSolr::HashWithResponse]
|
33
|
+
# rubocop:disable Style/HashSyntax
|
31
34
|
def suggest_results
|
32
35
|
suggest_params = { q: query, :'suggest.cfq' => document_id }
|
33
36
|
repository.connection.send_and_receive(iiif_config[:autocomplete_handler],
|
34
37
|
params: suggest_params)
|
35
38
|
end
|
39
|
+
# rubocop:enable Style/HashSyntax
|
36
40
|
end
|
37
41
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# adds controller-scope behavior to the implementing application
|
2
4
|
require 'rails/generators'
|
3
5
|
|
@@ -24,8 +26,8 @@ module BlacklightIiifSearch
|
|
24
26
|
inject_into_file "app/controllers/#{controller_name}_controller.rb", after: marker do
|
25
27
|
"\n\n # configuration for Blacklight IIIF Content Search
|
26
28
|
config.iiif_search = {
|
27
|
-
full_text_field: '
|
28
|
-
object_relation_field: '
|
29
|
+
full_text_field: 'all_text_timv',
|
30
|
+
object_relation_field: 'is_page_of_ssi',
|
29
31
|
supported_params: %w[q page],
|
30
32
|
autocomplete_handler: 'iiif_suggest',
|
31
33
|
suggester_name: 'iiifSuggester'
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# install BlacklightIiifSearch behavior into implementing application
|
2
4
|
require 'rails/generators'
|
3
5
|
|
@@ -8,8 +10,7 @@ module BlacklightIiifSearch
|
|
8
10
|
argument :search_builder_name, type: :string, default: 'search_builder'
|
9
11
|
argument :controller_name, type: :string, default: 'catalog'
|
10
12
|
|
11
|
-
class_option :'skip-solr', type: :boolean,
|
12
|
-
default: false, desc: 'Skip generating Solr configurations.'
|
13
|
+
class_option :'skip-solr', type: :boolean, default: false, desc: 'Skip generating Solr configurations.'
|
13
14
|
|
14
15
|
desc <<-EOS
|
15
16
|
Install generator for Blacklight IIIF Search
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# insert routing for IIIF Content Search
|
2
4
|
require 'rails/generators'
|
3
5
|
|
@@ -10,16 +12,16 @@ module BlacklightIiifSearch
|
|
10
12
|
|
11
13
|
# Add CommonwealthVlrEngine to the routes
|
12
14
|
def inject_iiif_search_routes
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
return if IO.read('config/routes.rb').include?('BlacklightIiifSearch::Routes')
|
16
|
+
|
17
|
+
marker = 'Rails.application.routes.draw do'
|
18
|
+
inject_into_file 'config/routes.rb', after: marker do
|
19
|
+
"\n\n concern :iiif_search, BlacklightIiifSearch::Routes.new"
|
20
|
+
end
|
21
|
+
# for blacklight_range_limit
|
22
|
+
bl_routes_marker = /resources :solr_documents[\S\s]*controller: 'catalog' do[\s]*concerns :exportable.*$/
|
23
|
+
inject_into_file 'config/routes.rb', after: bl_routes_marker do
|
24
|
+
"\n concerns :iiif_search"
|
23
25
|
end
|
24
26
|
end
|
25
27
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
# adds iiif_suggest configuration to Solr solrconfig.xml and schema.xml
|
2
4
|
# to allow for suggestions limited by a contextField
|
3
5
|
require 'rails/generators'
|
@@ -9,10 +11,11 @@ module BlacklightIiifSearch
|
|
9
11
|
desc 'Adds iiif_suggest configuration to Solr solrconfig.xml and schema.xml'
|
10
12
|
|
11
13
|
def inject_iiif_suggest_solrconfig
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
14
|
+
return if IO.read('solr/conf/solrconfig.xml').include?('iiif_suggest')
|
15
|
+
|
16
|
+
marker = '</config>'
|
17
|
+
inject_into_file 'solr/conf/solrconfig.xml', before: marker do
|
18
|
+
" <!-- BEGIN Blacklight IIIF Search autocomplete config -->
|
16
19
|
<!-- solr-tokenizing_suggester is necessary to return single terms from the suggester -->
|
17
20
|
<lib dir=\"${solr.install.dir:../../../..}/contrib\" regex=\"tokenizing-suggest-v1.0.1.jar\" />\n
|
18
21
|
<searchComponent name=\"iiif_suggest\" class=\"solr.SuggestComponent\">
|
@@ -22,7 +25,7 @@ module BlacklightIiifSearch
|
|
22
25
|
<str name=\"dictionaryImpl\">DocumentDictionaryFactory</str>
|
23
26
|
<str name=\"suggestAnalyzerFieldType\">textSuggest</str>
|
24
27
|
<str name=\"suggestTokenizingAnalyzerFieldType\">textSuggestTokenizer</str>
|
25
|
-
<str name=\"contextField\">
|
28
|
+
<str name=\"contextField\">is_page_of_ssi</str>
|
26
29
|
<str name=\"buildOnCommit\">true</str>
|
27
30
|
<str name=\"field\">iiif_suggest</str>
|
28
31
|
</lst>
|
@@ -38,16 +41,16 @@ module BlacklightIiifSearch
|
|
38
41
|
</arr>
|
39
42
|
</requestHandler>
|
40
43
|
<!-- END Blacklight IIIF Search autocomplete config -->\n\n"
|
41
|
-
end
|
42
44
|
end
|
43
45
|
end
|
44
46
|
|
45
47
|
def inject_iiif_suggest_schema
|
46
48
|
filepath = 'solr/conf/schema.xml'
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
49
|
+
return if IO.read(filepath).include?('iiif_suggest')
|
50
|
+
|
51
|
+
field_type_marker = '</types>'
|
52
|
+
inject_into_file filepath, before: field_type_marker do
|
53
|
+
"\n <!-- BEGIN Blacklight IIIF Search autocomplete config -->
|
51
54
|
<fieldType name=\"textSuggestTokenizer\" class=\"solr.TextField\" positionIncrementGap=\"100\">
|
52
55
|
<analyzer>
|
53
56
|
<tokenizer class=\"solr.WhitespaceTokenizerFactory\"/>
|
@@ -61,27 +64,26 @@ module BlacklightIiifSearch
|
|
61
64
|
</analyzer>
|
62
65
|
</fieldType>
|
63
66
|
<!-- END Blacklight IIIF Search autocomplete config -->\n\n"
|
64
|
-
|
67
|
+
end
|
65
68
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
+
fields_marker = '</fields>'
|
70
|
+
inject_into_file filepath, before: fields_marker do
|
71
|
+
" <!-- BEGIN Blacklight IIIF Search autocomplete config -->
|
69
72
|
<field name=\"iiif_suggest\" type=\"textSuggest\" indexed=\"true\" stored=\"true\" multiValued=\"true\" />
|
70
73
|
<!-- END Blacklight IIIF Search autocomplete config -->\n\n"
|
71
|
-
|
74
|
+
end
|
72
75
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
<copyField source=\"
|
76
|
+
copy_marker = '</schema>'
|
77
|
+
inject_into_file filepath, before: copy_marker do
|
78
|
+
" <!-- BEGIN Blacklight IIIF Search autocomplete config -->
|
79
|
+
<copyField source=\"all_text_timv\" dest=\"iiif_suggest\"/>
|
77
80
|
<!-- END Blacklight IIIF Search autocomplete config -->\n\n"
|
78
|
-
end
|
79
81
|
end
|
80
82
|
end
|
81
83
|
|
82
84
|
def copy_suggester_library
|
83
|
-
copy_file 'solr/lib/
|
84
|
-
'solr/lib/
|
85
|
+
copy_file 'solr/lib/tokenizing-suggest-v1.0.1.jar',
|
86
|
+
'solr/lib/tokenizing-suggest-v1.0.1.jar'
|
85
87
|
end
|
86
88
|
end
|
87
89
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'iiif_search_shared'
|
2
4
|
RSpec.describe CatalogController do
|
3
5
|
include_context 'iiif_search_shared'
|
@@ -18,11 +20,11 @@ RSpec.describe CatalogController do
|
|
18
20
|
end
|
19
21
|
|
20
22
|
describe '#iiif_search_config' do
|
21
|
-
subject { controller.iiif_search_config }
|
23
|
+
subject(:iiif_search_config) { controller.iiif_search_config }
|
22
24
|
it 'returns the iiif_search config' do
|
23
|
-
expect(
|
24
|
-
expect(
|
25
|
-
expect(
|
25
|
+
expect(iiif_search_config[:full_text_field]).not_to be_falsey
|
26
|
+
expect(iiif_search_config[:object_relation_field]).not_to be_falsey
|
27
|
+
expect(iiif_search_config[:supported_params]).not_to be_empty
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
@@ -31,10 +33,10 @@ RSpec.describe CatalogController do
|
|
31
33
|
controller.params = { q: query_term, foo: 'bar' }
|
32
34
|
end
|
33
35
|
|
34
|
-
subject { controller.iiif_search_params }
|
36
|
+
subject(:iiif_search_params) { controller.iiif_search_params }
|
35
37
|
it 'only returns the permitted params' do
|
36
|
-
expect(
|
37
|
-
expect(
|
38
|
+
expect(iiif_search_params.include?(:q)).to be_truthy
|
39
|
+
expect(iiif_search_params.include?(:foo)).to be_falsey
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
@@ -45,13 +47,13 @@ RSpec.describe CatalogController do
|
|
45
47
|
end
|
46
48
|
|
47
49
|
describe '#set_search_builder' do
|
48
|
-
it '
|
50
|
+
it 'uses IiifSearchBuilder' do
|
49
51
|
expect(controller.blacklight_config.search_builder_class).to eq(IiifSearchBuilder)
|
50
52
|
end
|
51
53
|
end
|
52
54
|
|
53
55
|
describe '#set_access_headers' do
|
54
|
-
it '
|
56
|
+
it 'sets the access control header' do
|
55
57
|
expect(response.headers['Access-Control-Allow-Origin']).to eq('*')
|
56
58
|
end
|
57
59
|
end
|
@@ -67,7 +69,7 @@ RSpec.describe CatalogController do
|
|
67
69
|
let(:json) { JSON.parse(response.body) }
|
68
70
|
|
69
71
|
it 'returns a response' do
|
70
|
-
expect(response).to
|
72
|
+
expect(response.code).to eq '200'
|
71
73
|
end
|
72
74
|
|
73
75
|
it 'returns a IIIF AnnotationList' do
|
@@ -86,7 +88,7 @@ RSpec.describe CatalogController do
|
|
86
88
|
let(:json) { JSON.parse(response.body) }
|
87
89
|
|
88
90
|
it 'returns a response' do
|
89
|
-
expect(response).to
|
91
|
+
expect(response.code).to eq '200'
|
90
92
|
end
|
91
93
|
|
92
94
|
it 'returns a IIIF TermList' do
|
@@ -1,272 +1,272 @@
|
|
1
1
|
# Sample Solr docs for full-text search, representing book and pages.
|
2
|
-
# We duplicate full text in
|
3
|
-
#
|
4
|
-
# requestHandler in solrconfig.xml in out-of-box Blacklight
|
2
|
+
# We duplicate full text in alternative_title_tsim field since this field
|
3
|
+
# is indexed and stored in schema.xml AND searched by default
|
4
|
+
# requestHandler in solrconfig.xml in out-of-box Blacklight 7.* Solr config,
|
5
5
|
# which allows us to test highlighting and snippets.
|
6
6
|
---
|
7
|
-
-
|
7
|
+
- object_model_ssi:
|
8
8
|
- Book
|
9
9
|
id:
|
10
10
|
- 7s75dn48d
|
11
|
-
|
11
|
+
label_ssi:
|
12
12
|
- Raw denim raclette hexagon
|
13
|
-
|
13
|
+
title_tsim:
|
14
14
|
- Raw denim raclette hexagon
|
15
|
-
|
16
|
-
|
15
|
+
title_ss: Raw denim raclette hexagon
|
16
|
+
author_tsim:
|
17
17
|
- Doe, Jane
|
18
|
-
|
19
|
-
|
18
|
+
author_ss: Jane Doe
|
19
|
+
has_searchable_text_bsi:
|
20
20
|
- true
|
21
|
-
|
21
|
+
text_direction_ssi:
|
22
22
|
- ltr
|
23
23
|
timestamp:
|
24
24
|
- '2015-11-18T21:22:14.23Z'
|
25
|
-
-
|
25
|
+
- object_model_ssi:
|
26
26
|
- ImageFile
|
27
27
|
id:
|
28
28
|
- 7s75dn59x
|
29
|
-
|
29
|
+
is_file_of_ssi:
|
30
30
|
- 7s75dn48d
|
31
|
-
|
31
|
+
is_following_page_of_ssi:
|
32
32
|
- 7s75dn58n
|
33
|
-
|
33
|
+
is_page_of_ssi:
|
34
34
|
- 7s75dn48d
|
35
|
-
|
35
|
+
is_preceding_page_of_ssi:
|
36
36
|
- 7s75dn60x
|
37
|
-
|
37
|
+
page_type_ssi:
|
38
38
|
- Normal
|
39
|
-
|
39
|
+
hand_side_ssi:
|
40
40
|
- RIGHT
|
41
|
-
|
41
|
+
page_num_label_ssi:
|
42
42
|
- 5
|
43
|
-
|
43
|
+
page_num_label_type_ssi:
|
44
44
|
- original
|
45
|
-
|
45
|
+
all_text_timv:
|
46
46
|
- In selecting sugar the confectioner must bear in mind that it is the foundation of all confectionery, and can not expect to manufacture iirst-class goods except from first-class material; hence, select only sugar that is perfectly dry and of uniform quality, and in white, hard, sparkling crystals; only such sugar will give satisfaction.
|
47
|
-
|
47
|
+
alternative_title_tsim:
|
48
48
|
- In selecting sugar the confectioner must bear in mind that it is the foundation of all confectionery, and can not expect to manufacture iirst-class goods except from first-class material; hence, select only sugar that is perfectly dry and of uniform quality, and in white, hard, sparkling crystals; only such sugar will give satisfaction.
|
49
49
|
timestamp:
|
50
50
|
- '2015-11-18T21:09:44.574Z'
|
51
|
-
-
|
51
|
+
- object_model_ssi:
|
52
52
|
- Book
|
53
53
|
id:
|
54
54
|
- 3j334603p
|
55
|
-
|
55
|
+
label_ssi:
|
56
56
|
- Quinoa gastropub snackwave
|
57
|
-
|
57
|
+
title_tsim:
|
58
58
|
- Quinoa gastropub snackwave
|
59
|
-
|
60
|
-
|
59
|
+
title_ss: Quinoa gastropub snackwave
|
60
|
+
author_tsim:
|
61
61
|
- Doe, John
|
62
|
-
|
63
|
-
|
62
|
+
author_ss: John Doe
|
63
|
+
has_searchable_text_bsi:
|
64
64
|
- true
|
65
|
-
|
65
|
+
text_direction_ssi:
|
66
66
|
- ltr
|
67
67
|
timestamp:
|
68
68
|
- '2015-11-18T19:32:49.014Z'
|
69
|
-
-
|
69
|
+
- object_model_ssi:
|
70
70
|
- ImageFile
|
71
71
|
id:
|
72
72
|
- 3j334628j
|
73
|
-
|
73
|
+
is_file_of_ssi:
|
74
74
|
- 3j334603p
|
75
|
-
|
75
|
+
is_page_of_ssi:
|
76
76
|
- 3j334603p
|
77
|
-
|
77
|
+
page_type_ssi:
|
78
78
|
- Normal
|
79
|
-
|
79
|
+
hand_side_ssi:
|
80
80
|
- RIGHT
|
81
|
-
|
81
|
+
page_num_label_ssi:
|
82
82
|
- 1
|
83
|
-
|
83
|
+
page_num_label_type_ssi:
|
84
84
|
- original
|
85
|
-
|
85
|
+
all_text_timv:
|
86
86
|
- In choosing Colors for candy, certain qualifications are necessary. First, they must not fade or change when exposed to the light. Second, they must not be easily affected by acids or alkalies; hence, it has been difficult to produce colors that are reasonably permanent and at the same time harmless. Yet the following will be found as near perfect as any yet produced.
|
87
|
-
|
87
|
+
alternative_title_tsim:
|
88
88
|
- In choosing Colors for candy, certain qualifications are necessary. First, they must not fade or change when exposed to the light. Second, they must not be easily affected by acids or alkalies; hence, it has been difficult to produce colors that are reasonably permanent and at the same time harmless. Yet the following will be found as near perfect as any yet produced.
|
89
89
|
timestamp:
|
90
90
|
- '2015-11-18T17:27:35.361Z'
|
91
|
-
-
|
91
|
+
- object_model_ssi:
|
92
92
|
- ImageFile
|
93
93
|
id:
|
94
94
|
- 7s75dn58n
|
95
|
-
|
95
|
+
is_file_of_ssi:
|
96
96
|
- 7s75dn48d
|
97
|
-
#
|
97
|
+
# is_following_page_of_ssi:
|
98
98
|
# - 7s75dn57c
|
99
|
-
|
99
|
+
is_page_of_ssi:
|
100
100
|
- 7s75dn48d
|
101
|
-
|
101
|
+
is_preceding_page_of_ssi:
|
102
102
|
- 7s75dn59x
|
103
|
-
|
103
|
+
page_type_ssi:
|
104
104
|
- Normal
|
105
|
-
|
105
|
+
hand_side_ssi:
|
106
106
|
- LEFT
|
107
|
-
|
107
|
+
page_num_label_ssi:
|
108
108
|
- 4
|
109
|
-
|
109
|
+
page_num_label_type_ssi:
|
110
110
|
- original
|
111
|
-
|
111
|
+
all_text_timv:
|
112
112
|
- Twelve pounds of sugar, two quarts of water, stir until dissolved, then add one full teaspoon of cream of tartar, (or if you wish to use glucose, add three pounds of same, do this when you are weighing your sugar, by hollowing out a place in the center of the sugar and pouring in the glucose). Now put on the steamer and let it remain until the batch begins to cook, then remove; in this way all the grains of sugar adhereing to the sides of the basin are washed down.
|
113
|
-
|
113
|
+
alternative_title_tsim:
|
114
114
|
- Twelve pounds of sugar, two quarts of water, stir until dissolved, then add one full teaspoon of cream of tartar, (or if you wish to use glucose, add three pounds of same, do this when you are weighing your sugar, by hollowing out a place in the center of the sugar and pouring in the glucose). Now put on the steamer and let it remain until the batch begins to cook, then remove; in this way all the grains of sugar adhereing to the sides of the basin are washed down.
|
115
115
|
timestamp:
|
116
116
|
- '2015-11-18T21:09:30.2Z'
|
117
|
-
-
|
117
|
+
- object_model_ssi:
|
118
118
|
- ImageFile
|
119
119
|
id:
|
120
120
|
- 7s75dn60x
|
121
|
-
|
121
|
+
is_file_of_ssi:
|
122
122
|
- 7s75dn48d
|
123
|
-
|
123
|
+
is_following_page_of_ssi:
|
124
124
|
- 7s75dn59x
|
125
|
-
|
125
|
+
is_page_of_ssi:
|
126
126
|
- 7s75dn48d
|
127
|
-
|
127
|
+
is_preceding_page_of_ssi:
|
128
128
|
- 7s75dn61x
|
129
|
-
|
129
|
+
page_type_ssi:
|
130
130
|
- Normal
|
131
|
-
|
131
|
+
hand_side_ssi:
|
132
132
|
- LEFT
|
133
|
-
|
133
|
+
page_num_label_ssi:
|
134
134
|
- 6
|
135
|
-
|
135
|
+
page_num_label_type_ssi:
|
136
136
|
- original
|
137
|
-
|
137
|
+
all_text_timv:
|
138
138
|
- when it begins to boil, add six pounds of Almond Nuts, after haying picked out all shells and dusted the nuts thoroughly; stir slowly, keeping the sides of the basin well washed, until nuts are as brown as wished, and slide off the spatula easily when raised up
|
139
|
-
|
139
|
+
alternative_title_tsim:
|
140
140
|
- when it begins to boil, add six pounds of Almond Nuts, after haying picked out all shells and dusted the nuts thoroughly; stir slowly, keeping the sides of the basin well washed, until nuts are as brown as wished, and slide off the spatula easily when raised up
|
141
141
|
timestamp:
|
142
142
|
- '2015-11-19T21:09:44.574Z'
|
143
|
-
-
|
143
|
+
- object_model_ssi:
|
144
144
|
- ImageFile
|
145
145
|
id:
|
146
146
|
- 7s75dn61x
|
147
|
-
|
147
|
+
is_file_of_ssi:
|
148
148
|
- 7s75dn48d
|
149
|
-
|
149
|
+
is_following_page_of_ssi:
|
150
150
|
- 7s75dn60x
|
151
|
-
|
151
|
+
is_page_of_ssi:
|
152
152
|
- 7s75dn48d
|
153
|
-
|
153
|
+
is_preceding_page_of_ssi:
|
154
154
|
- 7s75dn62x
|
155
|
-
|
155
|
+
page_type_ssi:
|
156
156
|
- Normal
|
157
|
-
|
157
|
+
hand_side_ssi:
|
158
158
|
- RIGHT
|
159
|
-
|
159
|
+
page_num_label_ssi:
|
160
160
|
- 7
|
161
|
-
|
161
|
+
page_num_label_type_ssi:
|
162
162
|
- original
|
163
|
-
|
163
|
+
all_text_timv:
|
164
164
|
- These Caramel receipts are the best in the worlds and the author questions the ability of any one to produce a Caramel that will excell them in any particular. After once making by either one of the following formulas, no other will be used, as they are worth a dozen times the price of this book, to any one wishing to give his trade a fine Caramel.
|
165
|
-
|
165
|
+
alternative_title_tsim:
|
166
166
|
- These Caramel receipts are the best in the worlds and the author questions the ability of any one to produce a Caramel that will excell them in any particular. After once making by either one of the following formulas, no other will be used, as they are worth a dozen times the price of this book, to any one wishing to give his trade a fine Caramel.
|
167
167
|
timestamp:
|
168
168
|
- '2015-11-20T21:09:44.574Z'
|
169
|
-
-
|
169
|
+
- object_model_ssi:
|
170
170
|
- ImageFile
|
171
171
|
id:
|
172
172
|
- 7s75dn62x
|
173
|
-
|
173
|
+
is_file_of_ssi:
|
174
174
|
- 7s75dn48d
|
175
|
-
|
175
|
+
is_following_page_of_ssi:
|
176
176
|
- 7s75dn61x
|
177
|
-
|
177
|
+
is_page_of_ssi:
|
178
178
|
- 7s75dn48d
|
179
|
-
|
179
|
+
is_preceding_page_of_ssi:
|
180
180
|
- 7s75dn63x
|
181
|
-
|
181
|
+
page_type_ssi:
|
182
182
|
- Normal
|
183
|
-
|
183
|
+
hand_side_ssi:
|
184
184
|
- LEFT
|
185
|
-
|
185
|
+
page_num_label_ssi:
|
186
186
|
- 8
|
187
|
-
|
187
|
+
page_num_label_type_ssi:
|
188
188
|
- original
|
189
|
-
|
189
|
+
all_text_timv:
|
190
190
|
- Same as Hickory-nut Cups, except make a center of almond paste, colored light green; when on the slab, add to the clear batch a few drops of red color, some Nectar flavor, and fold all together, pull on the hook to a bright pink, and finish as before.
|
191
|
-
|
191
|
+
alternative_title_tsim:
|
192
192
|
- Same as Hickory-nut Cups, except make a center of almond paste, colored light green; when on the slab, add to the clear batch a few drops of red color, some Nectar flavor, and fold all together, pull on the hook to a bright pink, and finish as before.
|
193
193
|
timestamp:
|
194
194
|
- '2015-11-21T21:09:44.574Z'
|
195
|
-
-
|
195
|
+
- object_model_ssi:
|
196
196
|
- ImageFile
|
197
197
|
id:
|
198
198
|
- 7s75dn63x
|
199
|
-
|
199
|
+
is_file_of_ssi:
|
200
200
|
- 7s75dn48d
|
201
|
-
|
201
|
+
is_following_page_of_ssi:
|
202
202
|
- 7s75dn62x
|
203
|
-
|
203
|
+
is_page_of_ssi:
|
204
204
|
- 7s75dn48d
|
205
|
-
|
205
|
+
is_preceding_page_of_ssi:
|
206
206
|
- 7s75dn64x
|
207
|
-
|
207
|
+
page_type_ssi:
|
208
208
|
- Normal
|
209
|
-
|
209
|
+
hand_side_ssi:
|
210
210
|
- RIGHT
|
211
|
-
|
211
|
+
page_num_label_ssi:
|
212
212
|
- 9
|
213
|
-
|
213
|
+
page_num_label_type_ssi:
|
214
214
|
- original
|
215
|
-
|
215
|
+
all_text_timv:
|
216
216
|
- as it looks cloudy, pour it out at once in a deep pan; this must be done quickly or it will become hard in the basin; when cold, remove it it from the pan in the same manner as the pan creams; mark it into bars or large squares for the counter.
|
217
|
-
|
217
|
+
alternative_title_tsim:
|
218
218
|
- as it looks cloudy, pour it out at once in a deep pan; this must be done quickly or it will become hard in the basin; when cold, remove it it from the pan in the same manner as the pan creams; mark it into bars or large squares for the counter.
|
219
219
|
timestamp:
|
220
220
|
- '2015-11-22T21:09:44.574Z'
|
221
|
-
-
|
221
|
+
- object_model_ssi:
|
222
222
|
- ImageFile
|
223
223
|
id:
|
224
224
|
- 7s75dn64x
|
225
|
-
|
225
|
+
is_file_of_ssi:
|
226
226
|
- 7s75dn48d
|
227
|
-
|
227
|
+
is_following_page_of_ssi:
|
228
228
|
- 7s75dn63x
|
229
|
-
|
229
|
+
is_page_of_ssi:
|
230
230
|
- 7s75dn48d
|
231
|
-
|
231
|
+
is_preceding_page_of_ssi:
|
232
232
|
- 7s75dn65x
|
233
|
-
|
233
|
+
page_type_ssi:
|
234
234
|
- Normal
|
235
|
-
|
235
|
+
hand_side_ssi:
|
236
236
|
- LEFT
|
237
|
-
|
237
|
+
page_num_label_ssi:
|
238
238
|
- 10
|
239
|
-
|
239
|
+
page_num_label_type_ssi:
|
240
240
|
- original
|
241
|
-
|
241
|
+
all_text_timv:
|
242
242
|
- cut into small squares; cook just to a thread; remove and, with the spatula, work the syrup on the sides of the basin till it becomes cloudy; pour all on a wire sieve, having a pan under it to catch the syrup that drains from the Cocoanuts
|
243
|
-
|
243
|
+
alternative_title_tsim:
|
244
244
|
- cut into small squares; cook just to a thread; remove and, with the spatula, work the syrup on the sides of the basin till it becomes cloudy; pour all on a wire sieve, having a pan under it to catch the syrup that drains from the Cocoanuts
|
245
245
|
timestamp:
|
246
246
|
- '2015-11-23T21:09:44.574Z'
|
247
|
-
-
|
247
|
+
- object_model_ssi:
|
248
248
|
- ImageFile
|
249
249
|
id:
|
250
250
|
- 7s75dn65x
|
251
|
-
|
251
|
+
is_file_of_ssi:
|
252
252
|
- 7s75dn48d
|
253
|
-
|
253
|
+
is_following_page_of_ssi:
|
254
254
|
- 7s75dn64x
|
255
|
-
|
255
|
+
is_page_of_ssi:
|
256
256
|
- 7s75dn48d
|
257
|
-
#
|
257
|
+
# is_preceding_page_of_ssi:
|
258
258
|
# - 7s75dn65x
|
259
|
-
|
259
|
+
page_type_ssi:
|
260
260
|
- Normal
|
261
|
-
|
261
|
+
hand_side_ssi:
|
262
262
|
- RIGHT
|
263
|
-
|
263
|
+
page_num_label_ssi:
|
264
264
|
- 11
|
265
|
-
|
265
|
+
page_num_label_type_ssi:
|
266
266
|
- original
|
267
|
-
|
267
|
+
all_text_timv:
|
268
268
|
- Take of dipping Cream any number of pounds desired, say five; put it into a basin inside of another one containing water; place on the fire; stir the Cream until dissolved, but not thin; add a few drops of red color, and flavor Nectar or Strawberry
|
269
|
-
|
269
|
+
alternative_title_tsim:
|
270
270
|
- Take of dipping Cream any number of pounds desired, say five; put it into a basin inside of another one containing water; place on the fire; stir the Cream until dissolved, but not thin; add a few drops of red color, and flavor Nectar or Strawberry
|
271
271
|
timestamp:
|
272
272
|
- '2015-11-24T21:09:44.574Z'
|